如何修复“未定义的businessObject”

时间:2019-08-01 20:52:38

标签: python-3.x object web-scraping beautifulsoup runtime-error

我是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'未定义

1 个答案:

答案 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本质上是从上到下动态填充的,而突变观察者则监视进度。