我有来自Google的XML提要,大约有300个条目。它看起来像这样:
<?xml version="1.0"?>
-<ns0:feed ns1:etag="W/"LIESANDCRAPfyt7I2A9WhHERE."" xmlns:ns4="http://www.w3.org/2007/app" xmlns:ns3="http://schemas.google.com/contact/2008" xmlns:ns2="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:ns1="http://schemas.google.com/g/2005" xmlns:ns0="http://www.w3.org/2005/Atom">
<ns0:updated>2012-01-25T14:52:12.867Z</ns0:updated>
<ns0:category term="http://schemas.google.com/contact/2008#profile" scheme="http://schemas.google.com/g/2005#kind"/>
<ns0:id>domain.com</ns0:id>
<ns0:generator version="1.0" uri="http://www.google.com/m8/feeds">Contacts</ns0:generator>
<ns0:author>
<ns0:name>domain.com</ns0:name>
</ns0:author>
<ns0:link type="text/html" rel="alternate" href="http://www.google.com/"/>
<ns0:link type="application/atom+xml" rel="http://schemas.google.com/g/2005#feed" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full"/>
<ns0:link type="application/atom+xml" rel="http://schemas.google.com/g/2005#batch" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/batch"/>
<ns0:link type="application/atom+xml" rel="self" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full?max-results=300"/>
<ns2:startIndex>1</ns2:startIndex>
<ns2:itemsPerPage>300</ns2:itemsPerPage>
<ns0:entry ns1:etag=""CRAPQR4KTit7I2A4"">
<ns0:category term="http://schemas.google.com/contact/2008#profile" scheme="http://schemas.google.com/g/2005#kind"/>
<ns0:id>http://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson</ns0:id>
<ns1:name>
<ns1:familyName>Person</ns1:familyName>
<ns1:fullName>Name Person</ns1:fullName>
<ns1:givenName>Name</ns1:givenName>
</ns1:name>
<ns0:updated>2012-01-25T14:52:13.081Z</ns0:updated>
<ns1:organization rel="http://schemas.google.com/g/2005#work" primary="true">
<ns1:orgTitle>JobField</ns1:orgTitle>
<ns1:orgDepartment>DepartmentField</ns1:orgDepartment>
<ns1:orgName>CompanyField</ns1:orgName>
</ns1:organization>
<ns3:status indexed="true"/>
<ns0:title>Name Person</ns0:title>
<ns0:link type="image/*" rel="http://schemas.google.com/contacts/2008/rel#photo" href="https://www.google.com/m8/feeds/photos/profile/domain.com/nperson"/>
<ns0:link type="application/atom+xml" rel="self" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson"/>
<ns0:link type="application/atom+xml" rel="edit" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson"/>
<ns1:email rel="http://schemas.google.com/g/2005#other" address="nperson@gapps.domain.com"/>
<ns1:email rel="http://schemas.google.com/g/2005#other" primary="true" address="nperson@domain.com"/>
<ns4:edited>2012-01-25T14:52:13.081Z</ns4:edited>
</ns0:entry>
<ns0:title>domain.com's Profiles</ns0:title>
</ns0:feed>
我能够通过以下代码将名称,组织和电子邮件字段中的数据与beautifulstonesoup一起提取:
profiles_feed = gd_client.GetProfilesFeed('https://www.google.com/m8/feeds/profiles/domain/domain.com/full?max-results=300')
soup = BeautifulSoup(str(profiles_feed))
for tag in soup.findAll('ns1:name'):
print tag.find('ns1:familyname').text
print tag.find('ns1:fullname').text
print tag.find('ns1:givenname').text
for tag in soup.findAll('ns1:organization'):
print tag.find('ns1:orgtitle').text
print tag.find('ns1:orgdepartment').text
print tag.find('ns1:orgname').text
for tag in soup.findAll('ns1:email',address=True):
print tag['address']
我希望能够从每个ns0:entry节点一起获取数据组,因此它会输出一行,如:姓氏,给定名称,组织标题,组织名称,电子邮件
我尝试过使用:
for tag in soup('ns0:entry'):
print tag.name.familyName.text
但它将其视为属性
我考虑过使用xpath,但我找不到任何关于beautifulstonesoup和xpath的文档,所以我不确定它是否支持原生。那么,我如何搜索每个入口节点并返回特定于该条目的所有数据,而不是按标签分组的所有数据。
答案 0 :(得分:1)
>>> from BeautifulSoup import BeautifulStoneSoup
>>> xml = """<ns0:feed ns1:etag="W/"LIESANDCRAPfyt7I2A9WhHERE."" xmlns:ns4="http://www.w3.org/2007/app" xmlns:ns3="http://schemas.google.com/contact/2008" xmlns:ns2="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:ns1="http://schemas.google.com/g/2005" xmlns:ns0="http://www.w3.org/2005/Atom">
... <ns0:updated>2012-01-25T14:52:12.867Z</ns0:updated>
... <ns0:category term="http://schemas.google.com/contact/2008#profile" scheme="http://schemas.google.com/g/2005#kind"/>
... <ns0:id>domain.com</ns0:id>
... <ns0:generator version="1.0" uri="http://www.google.com/m8/feeds">Contacts</ns0:generator>
... <ns0:author>
... <ns0:name>domain.com</ns0:name>
... </ns0:author>
... <ns0:link type="text/html" rel="alternate" href="http://www.google.com/"/>
... <ns0:link type="application/atom+xml" rel="http://schemas.google.com/g/2005#feed" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full"/>
... <ns0:link type="application/atom+xml" rel="http://schemas.google.com/g/2005#batch" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/batch"/>
... <ns0:link type="application/atom+xml" rel="self" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full?max-results=300"/>
... <ns2:startIndex>1</ns2:startIndex>
... <ns2:itemsPerPage>300</ns2:itemsPerPage>
... <ns0:entry ns1:etag=""CRAPQR4KTit7I2A4"">
... <ns0:category term="http://schemas.google.com/contact/2008#profile" scheme="http://schemas.google.com/g/2005#kind"/>
... <ns0:id>http://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson</ns0:id>
... <ns1:name>
... <ns1:familyName>Person</ns1:familyName>
... <ns1:fullName>Name Person</ns1:fullName>
... <ns1:givenName>Name</ns1:givenName>
... </ns1:name>
... <ns0:updated>2012-01-25T14:52:13.081Z</ns0:updated>
... <ns1:organization rel="http://schemas.google.com/g/2005#work" primary="true">
... <ns1:orgTitle>JobField</ns1:orgTitle>
... <ns1:orgDepartment>DepartmentField</ns1:orgDepartment>
... <ns1:orgName>CompanyField</ns1:orgName>
... </ns1:organization>
... <ns3:status indexed="true"/>
... <ns0:title>Name Person</ns0:title>
... <ns0:link type="image/*" rel="http://schemas.google.com/contacts/2008/rel#photo" href="https://www.google.com/m8/feeds/photos/profile/domain.com/nperson"/>
... <ns0:link type="application/atom+xml" rel="self" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson"/>
... <ns0:link type="application/atom+xml" rel="edit" href="https://www.google.com/m8/feeds/profiles/domain/domain.com/full/nperson"/>
... <ns1:email rel="http://schemas.google.com/g/2005#other" address="nperson@gapps.domain.com"/>
... <ns1:email rel="http://schemas.google.com/g/2005#other" primary="true" address="nperson@domain.com"/>
... <ns4:edited>2012-01-25T14:52:13.081Z</ns4:edited>
... </ns0:entry>
... <ns0:title>domain.com's Profiles</ns0:title>
... </ns0:feed>"""
来自文档的说明(http://www.crummy.com/software/BeautifulSoup/documentation.html#Parsing XML):
BeautifulStoneSoup最常见的缺点是它不知道自闭标签。 HTML有一组固定的自关闭标签,但是使用XML它取决于DTD所说的内容。您可以通过将其名称作为selfClosingTags参数传递给构造函数来告诉BeautifulStoneSoup某些标记是自动关闭的:
>>> soup = BeautifulStoneSoup(xml, selfClosingTags=['ns0:category','ns3:status', 'ns0:link','ns1:email'])
>>> a = soup.findAll('ns0:entry')
>>> a[0].find('ns1:familyname')
<ns1:familyname>Person</ns1:familyname>
>>> a[0].find('ns1:familyname').text
u'Person'
>>> a[0].find('ns1:givenname')
<ns1:givenname>Name</ns1:givenname>
>>> a[0].find('ns1:givenname').text
u'Name'
>>> for entry in a:
... print ', '.join([entry.find('ns1:familyname').text, entry.find('ns1:givenname').text, entry.find('ns1:orgtitle').text, entry.find('ns1:orgname').text, entry.find('ns1:email')['address']])
...
Person, Name, JobField, CompanyField, nperson@gapps.domain.com
希望这有帮助。