2015-03-27 36 views
5

này được dữ liệu xml của tôiLàm thế nào để lấy tất cả các nút con trong một truy vấn duy nhất sử dụng lxml & XPATH

<location> 
    <city> 
     <name> New York</name> 
     <type>non-capital</type> 
    </city> 

    <city> 
     <name> London</name> 
     <type>capital</type> 
    </city> 
</location> 

sử dụng lxml & python

from lxml import etree as ET 

parser = ET.XMLParser(recover=True) 

tree = ET.fromstring(xml_data,parser) 
print(tree.xpath('//city//name/text() | //city//type/text()')) 

Các công trình mã trên nhưng tôi muốn một mô tả mảng lồng nhau là [['New York','non-capital'],['London','capital']]

Truy vấn/kết hợp xpath chính xác của kết hợp truy vấn/vòng lặp để nhận được điều gì ở trên?

Trả lời

5

Đây là một cách thể:

....... 
result = [] 
for city in tree.xpath('//city'): 
    result.append([city.find('name').text, city.find('type').text]) 

print(result) 
# output : 
#[[' New York', 'non-capital'], [' London', 'capital']] 
2

Danh sách hiểu giải pháp:

xml_data='''<location> 
    <city> 
     <name> New York</name> 
     <type>non-capital</type> 
    </city> 
    <city> 
     <name> London</name> 
     <type>capital</type> 
    </city> 
</location>''' 

from lxml import etree as ET 

parser = ET.XMLParser(recover=True) 

tree = ET.fromstring(xml_data,parser) 
print(tree.xpath('//city')) 


cities = [[c.text for c in n if c.tail] for n in tree.xpath('//city')] 

Kết quả trong:

[[' New York', 'non-capital'], [' London', 'capital']] 
+0

'[[c.text cho c trong n] với n trong tree.xpath ('// city')] 'hoạt động tốt, c.tail làm gì? – wolfgang

+0

Chỉ là thói quen của tôi mà tôi có, nhưng trong trường hợp của bạn là không cần thiết. lxml có thể có văn bản bình thường và cái gọi là văn bản đuôi. Thêm [đây] (http://lxml.de/tutorial.html) – Marcin

+0

Tiếp tục nhận được lỗi này-ValueError: Các chuỗi Unicode có khai báo mã hóa không được hỗ trợ. Vui lòng sử dụng các byte đầu vào hoặc các đoạn XML mà không cần khai báo. –

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