2012-01-25 12 views
5

Yaklaşık 6 alan almak için Google XML'den geçmeye çalışıyorum. Google Apps Alanındaki kullanıcı profilleri için XML feed'ini çekmek için Google tarafından sağlanan gdata'yı kullanıyorum. Bu sonuç ise:XML python'dan veri al

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 

Bunu iade etmek alabilirsiniz:

<?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> 

Verileri ayrıştırmak için LXML kullanmaya çalışıyorum, ancak bu kadar iyi yürümüyor, bu benim kodudur besle ve sonra giriş, ama daha uzak keşfedemiyorum. İhtiyacım olan şey, ns1 adındaki ad alanlarını ve ns1 organizasyonundaki org alanını oluşturur. Biraz kayboldum, bu yüzden herhangi bir yardım büyük beğeni topluyor.

+0

Ne/hata sorunu "biraz kayıp" olmanın ötesinde, karşı karşıya? Ayrıca, sadece birkaç alana ihtiyacınız varsa, bunun için SAX'in ayrışmasını düşünün. – Marcin

+0

@marcin karşı karşıya olduğum problem, ihtiyacım olan alanları alamıyorum ve nasıl yapacağımı bilmiyorum. – Kevin

+0

Bu soruyu yeniden açmak için oy verildi. Temel sorun, isim alanlarının farkında olmamanızdır. Bkz. [Lxml objectify ile ad alanlarını kullanma] (http://lxml.de/objectify.html#namespace-handling) veya aynısını [xpath kullanarak kullanma] (http://lxml.de/xpathxslt.html#xpath) –

cevap

2

Hep kolaylığı nedeniyle, öğrenmeye API BeautifulSoup kullanmak tavsiye:

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 

Örnek çıktı:

Person 
Name Person 
Name 
JobField 
DepartmentField 
CompanyField 
+2

En azından XML ile uğraşıyorsanız 'BeautifulStoneSoup 'kullanın ... – ThiefMaster

+0

@ThiefMaster' BeautifulStoneSoup' kullanmak için güncellendi. Öneriniz için çok teşekkürler. – jcollado

+0

@jcollado Teşekkürler bu harika çalışıyor – Kevin

1

Mutlaka çalışmanızı kolaylaştıracak lxml.It ile Xpath Expressions kullanmayı deneyebilirsiniz .

Örneğin xml file: Firefox'un firebug eklenti kullanmak xpath için aşağıdaki kodu

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

Daha

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

.

İlgili konular