【问题标题】:Beautifulsoup multiple div content to dictionaryBeautifulsoup 多个 div 内容到字典
【发布时间】:2019-09-10 08:10:14
【问题描述】:

我尝试在 python 的字典中获取两个div 的内容。主要问题是我能够获取第一个 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

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup


    【解决方案1】:

    一个简单的方法是使用两个列表的 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()}
    

    【讨论】:

    • 嗯,我早该想到 CSS 选择器。无论哪种方式,这都很棒!
    【解决方案2】:

    这是使用zip 的一种方法。

    例如:

    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']})
    
    result = {key.get_text(strip=True): value.get_text(strip=True) for key, value in zip(regios[0::2], regios[1::2])}
    pprint(result)
    

    输出:

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

    如果您需要将值作为项目列表

    用途:

    result = {key.get_text(strip=True): [i.strip() for i in value.get_text(strip=True).split(",")] for key, value in zip(regios[0::2], regios[1::2])}
    

    输出:

    {'Achterhoek': ['Aalten',
                    'Berkelland',
                    'Bronckhorst',
                    'Doetinchem',
                    'Montferland',
                    'Oost Gelre',
                    'Oude IJsselstreek',
                    'Winterswijk'],
     'Amersfoort': ['Amersfoort',
                    'Baarn',
                    'Bunschoten',....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-15
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      相关资源
      最近更新 更多