如何只<div>获得必要的美丽汤



我需要从wikidata中解析一些关于使用BeautifulSoup编写器的信息。

页码:https://www.wikidata.org/wiki/Q39829

问题

我需要解析字段";"孩子";从页面。结果我想要得到3个名字。但我得到的不是3个名字,而是3个名字+2个额外的值。

代码

children_html = soup.find('div', id='P40').find_all('div', class_='wikibase-snakview-variation-valuesnak')
children_list = [child.text.strip() for child in children_html]
print(children_list)

结果是:

['Joe Hill', 'Owen King', 'Naomi King', 'https://books.google.de/books?id=aPBbAgAAQBAJ', '81']

问题

有没有办法在结果中只获得名称:

['Joe Hill', 'Owen King', 'Naomi King']

该代码也应该适用于其他编写器页面。谁可以生更少或更多的孩子

您离目标如此之近-只需将类更改为更具体的wikibase-statementview-mainsnak

soup.find('div', id='P40').find_all('div', class_='wikibase-statementview-mainsnak')

作为替代方案,您可以使用css selectors表示短手:

soup.select('#P40 .wikibase-statementview-mainsnak')

两者都会给你:

['Joe Hill', 'Owen King', 'Naomi King']

注意为了避免遇到NoneType错误,您应该始终检查元素是否存在

if soup.find('div', id='P40'):
children_html = soup.find('div', id='P40').find_all('div', class_='wikibase-statementview-mainsnak')
children_list = [child.text.strip() for child in children_html]
print(children_list)
else:
children_list = []
print('no child found')

或者在一行中,如果没有孩子,则生成一个空列表:

children_list = [child.text.strip() for child in soup.select('#P40 .wikibase-statementview-mainsnak')]

最新更新