首页 > 解决方案 > Beautifulsoup 多个 div 内容到字典

问题描述

我尝试div在 python 的字典中获取两个的内容。主要问题是我能够获取第一个div内容和第二个内容,但不能以正确的键:值方式。我只能拿回钥匙。因此,我知道我需要遍历内容,但我看不到我的for loop正确。

以下12无法完成我正在寻找的案例。

这是我迄今为止尝试过的:

from bs4 import BeautifulSoup
import requests
url='https://www.samenvoordeklant.nl/arbeidsmarktregios'
base=requests.get(url, timeout=15)
html=BeautifulSoup(base.text, 'lxml')
regios=html.find_all('div',attrs={'class':['field field--name-node-title field--type-ds field--label-hidden field__item animated','field field--name-field-gemeenten field--type-string-long field--label-hidden field__item animated']})

for regio in regios:
    print({regio.get_text(strip=True)})

结果:

{'Achterhoek'}
{'Aalten, Berkelland, Bronckhorst, Doetinchem, Montferland, Oost Gelre, Oude IJsselstreek, Winterswijk'}
{'Amersfoort'}
{'Amersfoort, Baarn, Bunschoten, Leusden, Nijkerk, Soest, Woudenberg'}

等等

我追求的结果是:

{'Achterhoek':'Aalten', 'Berkelland', 'Bronckhorst', 'Doetinchem', 'Montferland', 'Oost Gelre', 'Oude IJsselstreek', 'Winterswijk'}
{'Amersfoort':'Amersfoort', 'Baarn', 'Bunschoten', 'Leusden', 'Nijkerk', 'Soest', 'Woudenberg'}

等等。这让我之后可以pandas dataframe更轻松地将其移动到一个。

标签: pythonpython-3.xweb-scrapingbeautifulsoup

解决方案


一个简单的方法是使用两个列表的 dict 和 zip 。注意我使用了更快的 css 选择器并避免使用完整的多值类。

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.samenvoordeklant.nl/arbeidsmarktregios')
soup = bs(r.content, 'lxml')
result = dict(zip([i.text for i in soup.select('h2 a')], [i.text for i in soup.select('.field--type-string-long')]))
print(result)
# result = {k:v.split(', ') for k, v in result.items()}  ##add this line at end if want list as value rather than string

示例 pprint 输出:

在此处输入图像描述


如果您想要一个列表作为值,您可以简单地添加最后一行:

result = {k:v.split(', ') for k, v in result.items()}

推荐阅读