我是Python和网络抓取的新手。为了练习,我只是尝试从网站的某些HTML标签中提取一些公司名称。但是,代码未运行,并引发“未定义对象”错误。
from bs4 import BeautifulSoup
import requests
url = 'https://marketplace.akc.org/groomers/?location=Michigan&page=1'
response = requests.get(url, timeout = 5)
content = BeautifulSoup(response.content, "html.parser")
for business in content.find_all('div', attrs={"class": "groomer-salon-card__details"}):
businessObject = {
"BusinessName": business.find('h4', attrs={"class": "groomer-salon-card__name"}).text.encode('utf-8')
}
print (businessObject)
预期:我正在尝试从this网页上检索商家名称。
结果:
NameError:名称'businessObject'未定义
答案 0 :(得分:1)
完成时
content.find_all('div', attrs={"class": "groomer-salon-card__details"})
您实际上得到了一个空列表,因为没有匹配项。
所以,当你这样做
for business in content.find_all('div', attrs={"class": "groomer-salon-card__details"}):
您没有生成
businessObject
如评论中所述,这导致了您的错误。
使用javascript(以及其他DOM修改)从DOM中的elswhere动态加载内容。您仍然可以将JavaScript对象进行正则表达式,其中包含用于更新DOM的内容,就像在浏览器中看到的那样。然后,您可以使用json解析器进行解析,如下所示:
import requests, re, json
url = 'https://marketplace.akc.org/groomers/?location=Michigan&page=1'
response = requests.get(url, timeout = 5)
p = re.compile(r'state: (.*?)\n', re.DOTALL)
data = json.loads(p.findall(response.text)[0])
for listing in data['content']['search_results']['pages']['data']:
print(listing['organization_name'])
如果您在网页上查看页面源,您将看到DOM本质上是从上到下动态填充的,而突变观察者则监视进度。