我需要从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')]