[英]How can I get specific xml tags using BeautifulSoup in python 3.5?
這是我的芝加哥XML文件:route name =“ red”>
<route name = "red">
<train>
<rn>830</rn>
<destSt>30089</destSt>
<destNm>95th/Dan Ryan</destNm>
<trDr>5</trDr>
<nextStaId>41000</nextStaId>
<nextStpId>30194</nextStpId>
<nextStaNm>Cermak-Chinatown</nextStaNm>
<prdt>20180117 22:41:16</prdt>
<arrT>20180117 22:42:16</arrT>
<isApp>1</isApp>
<isDly>0</isDly>
<flags/>
<lat>41.85532</lat>
<lon>-87.63133</lon>
<heading>176</heading>
<route name="blue">
<train>
<rn>134</rn>
<destSt>30077</destSt>
<destNm>Forest Park</destNm>
<trDr>5</trDr>
<nextStaId>40570</nextStaId>
<nextStpId>30112</nextStpId>
<nextStaNm>California</nextStaNm>
<prdt>20180117 22:40:47</prdt>
<arrT>20180117 22:42:47</arrT>
<isApp>0</isApp>
<isDly>0</isDly>
<flags/>
<lat>41.92528</lat>
<lon>-87.70238</lon>
<heading>122</heading>
</train>
我能夠使用.find函數提取該火車的第一個火車編號和更多信息,但是現在我想為“路線=藍色”段落提取一列火車的標簽(以及該特定火車的日期)。 .. 我怎樣才能做到這一點? 我有麻煩,因為每個標簽都一樣。
我當前提取第一個標簽的代碼如下:
train = XML.find('rn')
print(train) #just a gist of the code
有什么解決辦法嗎? 我正在使用BeautifulSoup4
我不得不稍微更改您的xml,因為它的格式不正確,但是假設xml看起來像這樣:
<data>
<route name="red">
<train>
<rn>830</rn>
<destSt>30089</destSt>
<destNm>95th/Dan Ryan</destNm>
<trDr>5</trDr>
<nextStaId>41000</nextStaId>
<nextStpId>30194</nextStpId>
<nextStaNm>Cermak-Chinatown</nextStaNm>
<prdt>20180117 22:41:16</prdt>
<arrT>20180117 22:42:16</arrT>
<isApp>1</isApp>
<isDly>0</isDly>
<flags/>
<lat>41.85532</lat>
<lon>-87.63133</lon>
<heading>176</heading>
</train>
</route>
<route name="blue">
<train>
<rn>134</rn>
<destSt>30077</destSt>
<destNm>Forest Park</destNm>
<trDr>5</trDr>
<nextStaId>40570</nextStaId>
<nextStpId>30112</nextStpId>
<nextStaNm>California</nextStaNm>
<prdt>20180117 22:40:47</prdt>
<arrT>20180117 22:42:47</arrT>
<isApp>0</isApp>
<isDly>0</isDly>
<flags/>
<lat>41.92528</lat>
<lon>-87.70238</lon>
<heading>122</heading>
</train>
</route>
</data>
以下代碼獲取藍色或紅色的火車編號:
soup = bs4.BeautifulSoup(xml, 'xml')
soup.select_one('route[name="blue"] train rn').get_text()
soup.select_one('route[name="red"] train rn').get_text()
select
和select_one
函數允許CSS選擇器(即使在xml中)也可以選擇數據。 要過濾標簽的屬性,請使用tagname[attrname="attrvalue"]
。
如果要將該xml轉換為python數據結構,則可以執行以下操作:
from typing import *
import bs4
def xml_to_py(soup: bs4.BeautifulSoup) -> Dict[str, Dict[int, Dict[str, str]]]:
data = {}
for route in soup.select('route'):
route_data = data[route.get('name')] = {}
for train in route.select('train'):
train_number = int(train.select_one('rn').get_text())
train_data = {
tag.name: tag.get_text()
for tag in
train.select('*')
}
route_data[train_number] = train_data
return data
用上述xml的bs4.BeautifulSoup
實例調用,它將得到以下字典:
{
'blue': {
134: {
'arrT': '20180117 22:42:47',
'destNm': 'Forest Park',
'destSt': '30077',
'flags': '',
'heading': '122',
'isApp': '0',
'isDly': '0',
'lat': '41.92528',
'lon': '-87.70238',
'nextStaId': '40570',
'nextStaNm': 'California',
'nextStpId': '30112',
'prdt': '20180117 22:40:47',
'rn': '134',
'trDr': '5'
}
},
'red': {
830: {
'arrT': '20180117 22:42:16',
'destNm': '95th/Dan Ryan',
'destSt': '30089',
'flags': '',
'heading': '176',
'isApp': '1',
'isDly': '0',
'lat': '41.85532',
'lon': '-87.63133',
'nextStaId': '41000',
'nextStaNm': 'Cermak-Chinatown',
'nextStpId': '30194',
'prdt': '20180117 22:41:16',
'rn': '830',
'trDr': '5'
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.