在BeautifulSoup中传递NoneType属性

Kev*_*vin 0 python xml

我正在使用beautifulstonesoup和python从Google解析XML提要,并且效果很好.我也在创建一个csv并将其上传到Google Docs,这也很好.问题是当我遇到xml中的空文本属性时,解析器就会停止.现在不是问题,因为所有属性都有数据,但是第一次没有,它会破坏.

代码:

import atom
import gdata.auth
import gdata.contacts
import gdata.contacts.client
import gdata.docs.service
import gdata.docs.data
from BeautifulSoup import BeautifulStoneSoup as Soup
import csv

email = 'admin@domain.com'
password = 'password'
domain = 'domain.com'

ms_client = gdata.docs.service.DocsService()
gd_client = gdata.contacts.client.ContactsClient(domain=domain)
gd_client.ClientLogin(email, password, 'profileFeedAPI')
ms_client.ClientLogin(email, password, 'peopleCSVupload')

profiles_feed = gd_client.GetProfilesFeed('https://www.google.com/m8/feeds/profiles/domain/domain.com/full?max-results=300')

soup = Soup(str(profiles_feed), selfClosingTags=['ns0:category','ns3:status', 'ns0:link','ns1:email'])

a = soup.findAll('ns0:entry')
f = open('C:\\people.csv', 'wb')

writer = csv.writer(f, quoting=csv.QUOTE_NONE, escapechar =' ')

for entry in a:
    writer.writerow([entry.find('ns1:familyname').text + ',' + entry.find('ns1:givenname').text + ',' + entry.find('ns1:fullname').text + ',' + entry.find('ns1:orgtitle').text + ',' + entry.find('ns1:orgdepartment').text + ',' + entry.find('ns1:orgname').text + ',' + entry.find('ns1:email',primary=True)['address']])

f.close()

ms = gdata.data.MediaSource(file_path="C:\\people.csv", content_type=gdata.docs.service.SUPPORTED_FILETYPES['CSV'])
csv_entry = ms_client.Upload(ms, "People File")
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

for entry in a:
    if entry.find('ns1:orgtitle') != None:
        print entry.find('ns1:orgtitle').text
    elif entry.find('ns1:orgtitle') == None:
        print('')
    if entry.find('ns1:familyname') != None:
        print entry.find('ns1:familyname').text
    elif entry.find('ns1:familyname') == None:
        print('')
        etc...
Run Code Online (Sandbox Code Playgroud)

但它很长,我不知道如何将数据集中在一行上.任何帮助,非常感谢.

Jör*_*yer 6

你可以像这样包装查找:

def findnonempty(entry, arg):
    result = entry.find(arg):
    if result:
        return result.text
    else:
        return "" 
Run Code Online (Sandbox Code Playgroud)

你可以一个接一个地做7个调用,也可以使用map(),就像

tags = ['ns1:familyname', 'ns1:givenname', ... ] # your tags
s = map(lambda tag: findnonempty(entry, tag), tags)
"".join(s)
Run Code Online (Sandbox Code Playgroud)