【问题标题】:BeautifulSoup doesn't find all div tagsBeautifulSoup 没有找到所有的 div 标签
【发布时间】:2020-04-03 12:44:05
【问题描述】:

我已经开始了一个私人项目:在 Visual Studio Code (1.41.0) 中使用 Python 和 BeautifulSoup 进行网络抓取。

我能够抓取与我的“问题网站”具有相同结构的另一个网站。但是现在我遇到了,BeautifulSoup 没有找到所有 div 标签(每个站点应该有 20 个,我只找到了 3 个)。我已经在 Stack Overflow 上告知自己,但没有找到解决方案(或者显然不明白)。

网址:https://www.comparis.ch/gesundheit/arzt/pathologie

我感兴趣的html结构是这样的:

我从<div class="css-fh99y9 excbu0j0">...</div> 中获得了所有<div class="css-15dj4ut"></div>,但从<div class="css-roynbj excbu0j0"></div> 中没有。你知道为什么吗?

遍历每个 url 以到达每个站点。

for i in range(0, endIndex):
try:
    if i == 0:
        urls.append(basicUrl)
        page = urllib.request.urlopen(urls[i])
        soup = BeautifulSoup(page, 'html.parser')

        getSurgeonName(soup)

    else:
        urls.append(basicUrl + urlAddon + str(i + 1))
        page = urllib.request.urlopen(urls[i])
        soup = BeautifulSoup(page, 'html.parser')

        getSurgeonName(soup)

except:
    print("An URL request error occured.")

功能版本 1:

def getSurgeonName(soup):
    # gets just first 3 surgeons of site
    docName = re.compile('css-15dj4ut')
    docNameTags = soup.find_all('div', attrs={'class': docName})
    for a in docNameTags:
            docNameList.append(a.getText())

函数版本 2:

def getSurgeonName(soup):

    parentClass = re.compile('css-fh99y9 excbu0j0')
    parentItems = soup.find_all('div', attrs={'class': parentClass})

    for parent in parentItems:
           children = parent.findChildren('div', {"class": "css-15dj4ut"}) 
           docNameList.append(children[0].getText())

    parentClass = re.compile('css-roynbj excbu0j0')
    parentItems = soup.find_all('div', attrs={'class': parentClass})

    for parent in parentItems:
           children = parent.findChildren('div', {'class': 'css-15dj4ut'}) 
           docNameList.append(children[0].getText())

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    实际上,您所需的desired 数据是通过页面加载的JavaScript 动态加载的,因此requests 包将无法即时渲染JavaScript。但我已经找到了script标签,它保存了stringJSONdict中的数据,然后将其加载到JSON中。

    在这里你可以解析任何你想要的:)。

    import requests
    from bs4 import BeautifulSoup
    import json
    
    r = requests.get("https://www.comparis.ch/gesundheit/arzt/pathologie")
    soup = BeautifulSoup(r.content, 'html.parser')
    script = soup.find("script", {'id': '__NEXT_DATA__'}).text
    
    data = json.loads(script)
    
    print(data.keys())  # JSON Dict
    
    dumper = json.dumps(data, indent=4)
    
    print(dumper)  # to see it in human readble format
    

    类似:

    for item in data['props']['pageProps']['doctorResults']['doctorModels']:
        print(item['name'])
    

    输出:

    Mohamed Abdou
    Dr. med. Heiner Adams
    Dr. med. Franziska Aebersold
    Prof. Dr. med. Adriano Aguzzi
    Dr. med. Maria Ammann
    Prosper Anani
    Dr. med. Max Arnaboldi
    Dr. med. Walter Arnold
    Dr. med. Irena Baltisser
    Dr. med. Fridolin Bannwart
    Dr. med. Yara Banz
    Dr. med. André Barghorn
    Dr. Jessica Barizzi
    Prof. Dr. med. Daniel Baumhoer
    Audrey Baur Chaubert
    Dr. med. Christian Georg Bayerl
    Dr. med. Marc Beer
    Dr. med. Sabina Berezowska
    Dr. med. Steffen Bergelt
    Dr. med. Barbara Elisabeth Berger-Denzler
    

    【讨论】:

    • 嘿,艾哈迈德美国人!非常感谢您的快速回复。我非常高兴和感谢您的宝贵帮助!它确实像一个魅力。我仍然需要了解到底发生了什么(是的,你猜对了......我是新手 :D)以及它对我的项目有什么影响。不过你帮了我很大的忙!!!谢谢。
    • @MarcoRibolla 欢迎您,如果对您有帮助,请勾选问题旁边的复选标记,随时接受我的answer:P 您也可以投票。很高兴为您提供帮助
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多