2012-01-25 70 views
5

Tôi đang cố duyệt qua Google XML để truy xuất khoảng 6 trường. Tôi đang sử dụng gdata do Google cung cấp để lấy nguồn cấp dữ liệu XML cho các hồ sơ người dùng trong Miền Google Apps của tôi. Đây là kết quả:Truy xuất dữ liệu từ trăn XML

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

Tôi cố gắng để sử dụng lxml để phân tích dữ liệu, nhưng nó không làm việc ra rất tốt, đây là mã của tôi:

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 

tôi có thể có được điều này để trở lại nguồn cấp dữ liệu và sau đó nhập cảnh, nhưng tôi không thể khám phá xa hơn. ALl tôi cần là dạng văn bản các trường tên trong tên ns1 và trường org trong tổ chức ns1. Tôi là một chút bị mất, vì vậy bất kỳ trợ giúp được đánh giá cao.

+0

Bạn đang gặp phải vấn đề gì, ngoài việc bị "mất một chút"? Ngoài ra, hãy xem xét phân tích cú pháp SAX cho điều này nếu bạn chỉ cần một vài trường. – Marcin

+0

@marcin vấn đề tôi đang phải đối mặt là tôi không thể có được các lĩnh vực tôi cần, và tôi không biết làm thế nào để làm điều đó. – Kevin

+0

Đã bỏ phiếu để mở lại câu hỏi này. Vấn đề cơ bản là bạn không nhận thức được không gian tên. Xem [sử dụng các không gian tên với lxml objectify] (http://lxml.de/objectify.html#namespace-handling), hoặc thực hiện tương tự [using xpath] (http://lxml.de/xpathxslt.html#xpath) –

Trả lời

2

Tôi luôn luôn khuyên bạn nên sử dụng BeautifulSoup vì dễ học API của nó: đầu ra

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 

Ví dụ:

Person 
Name Person 
Name 
JobField 
DepartmentField 
CompanyField 
+2

Ít nhất hãy sử dụng 'BeautifulStoneSoup' nếu bạn đang xử lý XML ... – ThiefMaster

+0

@ThiefMaster Trả lời cập nhật để sử dụng' BeautifulStoneSoup'. Cảm ơn rất nhiều cho đề xuất của bạn. – jcollado

+0

@jcollado Cảm ơn tác phẩm tuyệt vời này – Kevin

1

Bạn có thể thử sử dụng Xpath Expressions với lxml.It chắc chắn sẽ giảm bớt công việc của bạn .

Ví dụ, nếu tập tin xml của bạn là:

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

Thân đoạn mã sau

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

Đối xpath sử dụng addon firebug firefox của.

Các vấn đề liên quan