2012-01-25 3 views
5

Я пытаюсь пройти Google XML, чтобы получить около 6 полей. Я использую gdata, предоставленную Google, чтобы вытащить фид XML для профилей пользователей в моем домене Google Apps. Это результат:Извлечь данные из XML python

<?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="[email protected]"/> 
     <ns1:email rel="http://schemas.google.com/g/2005#other" primary="true" address="[email protected]"/> 
     <ns4:edited>2012-01-25T14:52:13.081Z</ns4:edited> 
    </ns0:entry> 
    <ns0:title>domain.com's Profiles</ns0:title> 
</ns0:feed> 

Я пытаюсь использовать LXML для анализа данных, но он не работает так хорошо, это мой код:

import atom 
import gdata.auth 
import gdata.contacts 
import gdata.contacts.client 
from lxml import etree 
from lxml import objectify 

email = '[email protected]' 
password = 'password' 
domain = 'domain.com' 

gd_client = gdata.contacts.client.ContactsClient(domain=domain) 
gd_client.ClientLogin(email, password, 'profileFeedAPI') 

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

def PrintFeed(feed): 
    for i, entry in enumerate(feed.entry): 
    print '\n%s %s' % (i+1, entry.title.text) 

print(profiles_feed) 
PrintFeed(profiles_feed) 

profiles_feed2=(str(profiles_feed)) 

root = objectify.fromstring(profiles_feed2) 

print root 

print root.tag 
print root.text 

for e in root.entry(): 
    print e.tag 
    print e.text 

я могу получить это, чтобы вернуться и затем вход, но я не могу исследовать дальше. ALl Мне нужна текстовая форма полей имени в имени ns1 и поле org в организации ns1. Я немного потерян, поэтому любая помощь очень ценится.

+0

С какой проблемой вы сталкиваетесь, за исключением того, что она «немного потеряна»? Кроме того, рассмотрите синтаксический анализ SAX для этого, если вам просто нужно несколько полей. – Marcin

+0

@marcin проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить поля, в которых я нуждаюсь, и я не знаю, как это сделать. – Kevin

+0

Проголосовали за повторный запуск этого вопроса. Основная проблема заключается в том, что вы не знаете пространства имен. См. [Using namespaces with lxml objectify] (http://lxml.de/objectify.html#namespace-handling) или выполните то же самое [с помощью xpath] (http://lxml.de/xpathxslt.html#xpath) –

ответ

2

Я всегда рекомендую использовать BeautifulSoup из-за его легко узнать API:

from BeautifulSoup import BeautifulStoneSoup as Soup 

soup = Soup(open(filename)) 
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 

Пример вывода:

Person 
Name Person 
Name 
JobField 
DepartmentField 
CompanyField 
+2

По крайней мере, используйте 'BeautifulStoneSoup', если вы имеете дело с XML ... – ThiefMaster

+0

@ThiefMaster Ответ обновлен, чтобы использовать' BeautifulStoneSoup'. Большое спасибо за ваше предложение. – jcollado

+0

@jcollado Спасибо, что работает отлично – Kevin

1

Вы можете попробовать использовать Xpath Expressions с lxml.It, несомненно, облегчит вашу работу ,

Например, если ваш файл XML является:

<document> 
     <name> 
       <familyName>Person</familyName> 
       <fullName>Name Person</fullName> 
       <givenName>Name</givenName> 
     </name> 
</document> 

Чем следующий код

>>> import lxml 
>>> from lxml import etree 
>>> et = etree.parse("test.xml") 
>>> value = et.xpath("/document/name/*/text()") 
>>> value 
['Person', 'Name Person', 'Name'] 

Для использования Firebug XPath аддон Фирефокса.

Смежные вопросы