gpt4 book ai didi

python - 循环迭代过早终止的 BeautifulSoup 解析树元素列表

转载 作者:行者123 更新时间:2023-11-28 01:01:10 27 4
gpt4 key购买 nike

我正在学习数据科学入门类(class),我的第一个任务是从 CIA World Factbook 的每个国家/地区页面中提取某些数据字段。尽管我最近意识到有更简单的方法来定位数据,但我还是想按照我最初的思考过程进行操作,如下所示。

我开发了一个迭代以下结果的函数:

for link in fulllink:
with urlopen(link) as countrypage:
countrysoup = BeautifulSoup(countrypage, "lxml")
data = countrysoup.find_all(class_="category_data")

我已经确认,如果我需要的字符串值存在于国家/地区页面上,它们将出现在“数据”中。以下函数接受一个标签并与 .parent 和 .previous_sibling 一起工作以确定附加到标签的字符串值是我有兴趣提取的那个。

def get_wfb_data(x):
country_data = [0,0,0,0]
for tag in x:
try:
if 'Area:' in tag.parent.previous_sibling.previous_sibling.strings and 'total: ' in tag.parent.strings:
country_data[0]=tag.string
elif 'GDP (purchasing power parity):' in tag.previous_sibling.previous_sibling.strings:
country_data[1]=tag.string
elif 'Roadways:' in tag.parent.previous_sibling.previous_sibling.strings and 'total: ' in tag.parent.strings:
country_data[2]=tag.string
elif 'Railways:' in tag.parent.previous_sibling.previous_sibling.strings and 'total: ' in tag.parent.strings:
country_data[3]=tag.string
else:
continue
except:
pass

return country_data

异常处理用于处理不具有此类属性的 NavigableString 对象,从而引发异常。替换零列表中的值使我能够处理特定区域没有在我有兴趣提取的四个类别之一中列出的数据的情况。此外,定义为四个独立的函数,各自的标准起作用,但在一起时非常慢,因为列表必须最多迭代我们的时间。但是,此函数的最终结果始终是一个列表,其中第一个零已被替换,但其他零没有像下面这样[“总面积#”,0,0,0].

我认为循环在将第一个 if 语句与 x 中的标记匹配后终止,我该如何修复我的函数以继续向下 x?

最佳答案

我假设您正在进行此调用:get_wfb_data(data)

你的函数永远不会失败,它永远不会匹配你的其他条件。

我在几个不同的链接上进行了尝试(每个链接都包含 GDP、道路等数据)

通过检查 x 的长度并打印 for 循环的迭代次数,您可以确保循环不会在匹配第一个条件后终止,然后未能到达最后一个数据元素。实际上是剩余的条件永远不会满足。

def get_wfb_data(x):
country_data = [0, 0, 0, 0]
print(len(x))
i = 0
for tag in x:
i += 1
try:
if 'Area:' in tag.parent.previous_sibling.previous_sibling.strings \
and 'total: ' in tag.parent.strings:
country_data[0] = tag.string
elif 'GDP (purchasing power parity):' in tag.previous_sibling.previous_sibling.strings:
country_data[1] = tag.string
elif 'Roadways:' in tag.parent.previous_sibling.previous_sibling.strings \
and 'total: ' in tag.parent.strings:
country_data[2] = tag.string
elif 'Railways:' in tag.parent.previous_sibling.previous_sibling.strings \
and 'total: ' in tag.parent.strings:
country_data[3] = tag.string
else:
continue
except:
pass
print(str(i))
return country_data

关于python - 循环迭代过早终止的 BeautifulSoup 解析树元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42143850/

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