2015-09-04 149 views
0

的具體兄弟我有一個XML頁面的結構如下:查找元素

<address> 
<city>Anaheim</city> 
<state>California</state> 
<zip>92801</zip> 
<country>United States</country> 
</address> 

<address> 
<city>Berkley</city> 
<state>California</state> 
<zip>94705</zip> 
<country>United States</country> 
</address> 

我想獲得這個城市的標籤,其中拉鍊標記值滿足條件的只有值。 比如我需要那些城市的名字,其中的zip = 92801。

是否有蟒蛇一個簡單的方法來做到這一點?

+0

我會在BeautifulSoup解決方案特別感興趣,因爲我解析與該網站的其他部分。 –

回答

0

my_string = ''' 
<root> 
    <address> 
    <city>Anaheim</city> 
    <state>California</state> 
    <zip>92801</zip> 
    <country>United States</country> 
    </address> 
    <address> 
    <city>Berkley</city> 
    <state>California</state> 
    <zip>94705</zip> 
    <country>United States</country> 
    </address> 
</root> 
''' 

from bs4 import BeautifulSoup 
soup = BeautifulSoup(my_string, 'html.parser') 
desired_zips = soup.findAll('zip', text="92801") 
cities = [] 
for zip_tag in desired_zips: 
    cities.append(zip_tag.findPreviousSibling('city')) 

print(cities) 

輸出:

[<city>Anaheim</city>] 

注意:你可以寫這個for循環到一個列表理解,但它看起來笨重且無法讀取。

+0

謝謝 - 制定出很好。 –

2

這會達到預期的效果:

my_string = ''' 
    <root> 
    <address> 
     <city>Anaheim</city> 
     <state>California</state> 
     <zip>92801</zip> 
     <country>United States</country> 
    </address> 
    <address> 
     <city>Berkley</city> 
     <state>California</state> 
     <zip>94705</zip> 
     <country>United States</country> 
    </address> 
    </root> 
''' 

from lxml import etree 

root = etree.fromstring(my_string) 
cities = root.xpath('.//zip[text()="92801"]/preceding-sibling::city') 
1

怎麼樣,如果你想使用,而不是美麗的湯使用ElementTree

import xml.etree.ElementTree as ET 
tree = ET.parse('country_data.xml') 
root = tree.getroot() 

filtered_addresses = [] 
for address in root.findall('address'): 
    if address.get('zip') == '92801': 
     filtered_addresses.append(address)