簡體   English   中英

如何在python 3.5中使用BeautifulSoup獲取特定的xml標簽?

[英]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()

selectselect_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM