属性错误: 'NoneType'对象没有属性'div'



我得到一个类似标题的错误。

Traceback (most recent call last):
File "C:/2.py", line 40, in <module>
reviews.append(reviews_info(div))
File "C:/2.py", line 21, in reviews_info
review_text = div.find("div", "review-content").div.text 
AttributeError: 'NoneType' object has no attribute 'div'

我想我可能输入了错误的元素。

我没有从头开始写代码。我已经应用了以前对其他网站进行爬网的代码。

如何更改元素并将其翻转??我觉得我写得不错。但是有一个错误。

ps恐怕会有人评论使用api。但这是使用它的方式,因为它是有限的。

import sys
from bs4 import BeautifulSoup
import urllib.request
import requests
from urllib.parse import quote
import os
import xlwt
import re  
import time
import random
import re, requests, csv
from bs4 import BeautifulSoup
from time import sleep
# CMD chcp 65001

def reviews_info(div):
review_text = div.find("div", "review-content").div.text 
review_stars = div.find("div", "i-stars i-stars--regular-1 rating-large").a.text
return {
"review_text" : review_text,
"review_stars" : review_stars,
}
base_url = "https://www.yelp.com/biz/founding-farmers-d-c-washington-2?start="
reviews = []
NUM_PAGES = 36
for page_num in range(1, NUM_PAGES + 20):
print("souping page", page_num, ",", len(reviews), "data")
url = base_url + str(page_num)
soup = BeautifulSoup(requests.get(url).text, 'lxml') 
for div in soup('div', 'review-content'):
reviews.append(reviews_info(div))
sleep(5)#############################################
#  Save dict data
keys = reviews[0].keys()
with open('testtest.csv', 'w', encoding="utf-8") as f:
dict_writer = csv.DictWriter(f, delimiter=',', lineterminator='n', fieldnames=keys)
dict_writer.writeheader()
dict_writer.writerows(reviews)

在for循环中,您已经将类属性为"review content"的div传递给reviews_info。所以你最好去掉.find("div", "review-content")部分。这可能是造成错误的原因。

显然,你需要复习日期和星星。

您可以使用包含日期的span标签,而不是使用div.div.text来提取日期,如下所示:

review_date = div.span.next_element.strip()

用于提取评分的表达式将引发另一个错误。

"i-stars i-stars-常规-1评级大"适用于1星评级。因此,一个4星评级将有一个divclass="i-stars i-stars--regular-4 rating-large",依此类推

因此,您可以使用regex来过滤包含评级的div

review_stars = div.find('div', {'class': re.compile(r'i-stars')}).img['alt']

把这两个部分放在一起,reviews_info函数中需要更改的两行是:

review_date = div.span.next_element.strip()
review_stars = div.find('div', {'class': re.compile(r'i-stars')}).img['alt']

做出这些改变,你就应该做好出发的准备。

额外信息:

我没有使用div.span.text.strip()提取文本的原因是,如果评论在发布后更新,span标签也包含该细节。并利用span.text提取了该信息。因此,我选择了next_element

免责声明:我在第三页单独测试了它,它对我有效。我不确定其他页面是否能正常工作。

最新更新