我收到标题错误。
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)
答案 0 :(得分:0)
在for循环中,您已经传递给reviews_info
具有&#39; review-content&#39;类属性的div。因此,您最好不要删除.find("div", "review-content")
部分。这可能是导致错误的原因。
显然,您需要审核日期和明星。
您可以使用包含日期的div.div.text
标记,而不是使用span
来提取日期,而不是:
review_date = div.span.next_element.strip()
用于提取评级的表达式将引发另一个错误。
&#34; i-stars i-stars - regular-1 rating-large&#34;适用于1星评级。因此,四星评级的div
为class="i-stars i-stars--regular-4 rating-large"
,依此类推。
因此,您可以使用正则表达式来过滤包含评分的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
。
免责声明:我单独在第三页测试了它,它对我有用。我不确定其他网页是否可以正常运行。