gpt4 book ai didi

python - 使用Python模块BeautifulSoup抓取XML,需要树中的特定标签

转载 作者:行者123 更新时间:2023-12-01 05:21:16 25 4
gpt4 key购买 nike

所以我已经研究这个 python 脚本一段时间了,我正在尝试抓取 Leg 标签下的 Duration 和 Distance 标签。问题是,在Step标签中,还有一个名为Duration和Distance的子标签,并且Step标签是Leg标签的子标签。当我抓取数据时,它也会返回那些距离和持续时间标签。 XML如下:

<DirectionsResponse>
<route>
<leg>
<step>...</step>
<step>
<start_location>
<lat>38.9096855</lat>
<lng>-77.0435397</lng>
</start_location>
<duration>
<text>1 min</text>
</duration>
<distance>
<text>39 ft</text>
</distance>
</step>
<duration>
<text>2 hours 19 mins</text>
</duration>
<distance>
<text>7.1 mi</text>
</distance>
</leg>
</route>
</DirectionsResponse>

这是我正在使用的 Python 脚本:

import urllib
from BeautifulSoup import BeautifulSoup

url = 'https://www.somexmlgenerator.com/directions/xml?somejscript'
res = urllib.urlopen(url)
html = res.read()

soup = BeautifulSoup(html)
soup.prettify()
leg = soup.findAll('leg')

for eachleg in leg:
another_duration = eachleg('duration')
print eachleg

正如我所提到的,我已经这样做了一段时间,并且也尝试过使用 lxml,但是由于 XML 是动态生成的,所以我很难通过它来抓取 XML。我已经采取了将 XML 抓取为 HTML 的方法,但我绝对愿意接受其他建议,因为我还是个新手!

最佳答案

使用 BeautifulSoup(使用版本 4,称为 bs4),您需要将 recursive=False 传递到 findAll 以阻止它拾取错误的持续时间:

from bs4 import BeautifulSoup

soup = BeautifulSoup(..., 'xml')

for leg in soup.route.find_all('leg', recursive=False):
duration = leg.duration.text.strip()
distance = leg.distance.text.strip()

或者使用 CSS:

for leg in soup.select('route > leg'):
duration = leg.duration.text.strip()
distance = leg.distance.text.strip()

使用 lxml,您只需使用 XPath:

durations = root.xpath('/DirectionsResponse/route/leg/duration/text/text()')
distances = root.xpath('/DirectionsResponse/route/leg/distance/text/text()')

关于python - 使用Python模块BeautifulSoup抓取XML,需要树中的特定标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com