我试图对yelp评论做分析,而且我在循环浏览多个评论时遇到了问题。我目前的代码:
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.yelp.com/biz/pizzafire-cleveland')
soup = BeautifulSoup(r.text, 'html.parser')
results = soup.find_all('div', class_='review review--with-sidebar')
records=[]
for result in results:
a = 0
while a<21:
a += 1
first_result = results[len(a)] #this is where my code is breaking
#get review
REV1 = first_result.find('p').text
print REV1
#get date
Date = first_result.find('span', class_='rating-qualifier').text
print Date
#get username
username = first_result.find('li', class_='user-name').text
#get user location
userlocation = first_result.find('b').text
#get userrating
userrating = first_result.find('img', class_='offscreen').get('alt')
#get userstats
userstats = first_result.find('ul', class_='user-passport-
stats').text.split()
friendcount = userstats[0]
reviewcount = userstats[2]
photouploadcount = userstats[4]
yelpstatus = userstats[6]
#get user link
links=[]
for a in results[0]('a', href=True):
links.append(a['href'].split())
userlink= str(links[0])[4:-2]
print userlink
结果[0]指的是第一次审查。我希望它继续审查1, 2,有没有人知道如何在first_result中循环结果?
谢谢你, 纳扎尔
答案 0 :(得分:0)
它应该仍然是结果(a),而不是结果(len(a)):
a = 0
while a < 21:
a += 1
first_result = results[a]
此外,使用for循环可以更好地执行此操作:
for a in range(21):
first_result = results[a]
然而,这只会将first_result重置为结果中的所有内容。似乎这里有很多格式问题需要解决。
答案 1 :(得分:0)
for循环的前几行是多余的。正如埃文诺瓦克所说,
for a in range(21):
first_result = results[a]
将是一个不错的选择。但由于results
是一个列表,您可以进一步缩短它:
for result in result:
在原始代码中,除了将result
变量分配给first_result
之外,您没有使用for a in results[0]('a', href=True):
links.append(a['href'].split())
变量。您可以完全删除其中一个,也可以在代码中的任何位置将'first_result'更改为'result'。
此外,您正在对内部for循环中的值0进行硬编码:
{{1}}
我认为这不是故意的。所以,如果忽略了这一点,请改变它。
最后,请查看The Best of the Best Practices (BOBP) Guide for Python以获取有关更好格式化和常规编码实践的更多提示。