私はbeautifulstonesoupとpythonを使用してGoogleからのXMLフィードを解析しています。私もcsvを作成してGoogle Docsにアップロードしていますが、これもうまくいきます。問題は、xmlの空のテキスト属性に遭遇したときにパーサが停止することです。すべての属性にデータがあるので、今は問題ではありませんが、初めてデータがないと、データが破損します。BeautifulSoupのNoneType属性を渡す
コード:
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 = '[email protected]'
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")
私はこれを行うことができます知っている:
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...
しかし、それは非常に長く、私が表示されるようにデータを集中させる方法がわかりません1行どんな助けでも、大いに感謝します。
バイエルがスローされます、私は週末のために離れていました。これは素晴らしい解決策ですが、私には1つの質問しかありません。最後の項目は、電子メールアドレスが属性であり、テキストフィールドではありません。そのデータをどのように抽出することができますか? – Kevin
Nevermindは、entry.find( 'ns1:email'、primary = True)['address']という変数tを宣言し、ブロック内のforエントリにs.append(t)を実行しました。この。 – Kevin
ようこそ、ケビン。 –