我已经开始一个私人项目:在Visual Studio Code(1.41.0)中使用Python和BeautifulSoup进行网络抓取。
我能够抓取另一个结构与我的“问题站点”相同的站点。但是现在我遇到了,BeautifulSoup找不到所有div标签(每个站点应该有20个,而我只发现3个)。我已经告知自己有关堆栈溢出的信息,但是没有找到解决方案(或者显然不理解)。
网站:https://www.comparis.ch/gesundheit/arzt/pathologie
我感兴趣的html结构如下所示:
我<div class="css-15dj4ut"></div>
从那里得到了所有,但从那里<div class="css-fh99y9 excbu0j0">...</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())
实际上,您所需的desired
数据是通过JavaScript
页面加载时动态加载的,因此requests
程序包将无法JavaScript
即时呈现。但我已经能够找到script
它捧在数据标签string
的JSON
dict
,然后装成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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句