Python 3.x 显示两个差异é;使用我用来刮取其他页面的相同代码出租错误
我使用了一个代码从tripadvisor中抓取了两页,效果非常好。但现在,它向我展示了两种不同的错误:Python 3.x 显示两个差异é;使用我用来刮取其他页面的相同代码出租错误,python-3.x,web-scraping,beautifulsoup,Python 3.x,Web Scraping,Beautifulsoup,我使用了一个代码从tripadvisor中抓取了两页,效果非常好。但现在,它向我展示了两种不同的错误: 打开(“iletaitunsquare1.csv”,“w”,encoding=“utf-8-sig”,newline=”)作为csv\u文件: w=csv.writer(csv_文件,分隔符=“;”,quoting=csv.QUOTE_最小) w、 writerow([“inf\u rest\u name”、“rest\u eclf”、“name\u client”、“date\u rev\
打开(“iletaitunsquare1.csv”,“w”,encoding=“utf-8-sig”,newline=”)作为csv\u文件:
w=csv.writer(csv_文件,分隔符=“;”,quoting=csv.QUOTE_最小)
w、 writerow([“inf\u rest\u name”、“rest\u eclf”、“name\u client”、“date\u rev\u cli”、“opinion\u cl”])
带着请求。会话()作为s:
对于范围内的偏移(2701230,10):
url=f'https://www.tripadvisor.fr/Restaurant_Review-g187147-d6575305-Reviews-or{offset}-Il_Etait_Un_Square-Paris_Ile_de_France.html'
r=s.get(url)
汤=bs(r.含量,'lxml')
评论=汤。选择('.reviewSelector')
ids=[review.get('data.reviewid')用于在评论中进行评论]
r=s.post(
'https://www.tripadvisor.fr/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS_RESP&metaReferer=',
数据={'reviews':','.join(ids),'contextChoice':'DETAIL'},
headers={'Referer':r.url}
)
汤=bs(r.含量,'lxml')
如果不偏移:
inf\u rest\u name=soup。选择一个('.heading').text.replace(“\n”,”).strip()
rest\u eclf=soup。选择一个('.header\u links a')。text.strip()
用于在汤中查看。选择('.reviewSelector'):
name_client=review。选择_one('.info_text>div:first child')。text.strip()
日期\u rev\u cl=审核。选择一个('.ratingDate')['title'].strip()
titre_rev_cl=review。选择一个('.noQuotes')。text.strip()
意见\u cl=review。选择一个('.partial\u entry').text.replace(“\n”,”).strip()
行=[f{inf_rest_name}、f{rest_eclf}、f{name_client}、f{date_rev_cl}、f{titre_rev_cl}、f{opinion_cl}]
w、 writerow(世界其他地区)
执行时出错:
数据={'reviews':','.join(ids),'contextChoice':'DETAIL'}
TypeError:序列项0:应为str实例,未找到类型“
在我决定只更改第6行(站点页面)和第7行(Url)中的值之后:
打开(“boutary.csv”,“w”,encoding=“utf-8-sig”,newline=”)作为csv\u文件:
w=csv.writer(csv_文件,分隔符=“;”,quoting=csv.QUOTE_最小)
w、 书面文件([“inf\u rest\u name”、“rest\u eclf”、“name\u client”、“date\u rev\u cl”、“titre\u rev\u cl”、“opinion\u cl”])
将requests.Session()作为s:
对于范围内的偏移(40290,10):
url=f'https://www.tripadvisor.fr/Restaurant_Review-g187147-d9783452-Reviews-or{offset}-Boutary-Paris_Ile_de_France.html'
r=s.get(url)
汤=bs(r.含量,'lxml')
评论=汤。选择('.reviewSelector')
ids=[review.get('data-reviewid')用于在评论中进行评论]
r=s.post(
'https://www.tripadvisor.fr/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS_RESP&metaReferer=',
数据={'reviews':','.join(ids),'contextChoice':'DETAIL'},
headers={'referer':r.url}
)
汤=bs(r.含量,'lxml')
如果不偏移:
inf\u rest\u name=soup。选择一个('.heading').text.replace(“\n”,”).strip()
rest\u eclf=soup。选择一个('.header\u links a')。text.strip()
用于在汤中查看。选择('.reviewSelector'):
name_client=review。选择_one('.info_text>div:first child')。text.strip()
日期\u rev\u cl=审核。选择一个('.ratingDate')['title'].strip()
titre_rev_cl=review。选择一个('.noQuotes')。text.strip()
意见\u cl=review。选择一个('.partial\u entry').text.replace(“\n”,”).strip()
行=[f{inf_rest_name}、f{rest_eclf}、f{name_client}、f{date_rev_cl}、f{titre_rev_cl}、f{opinion_cl}]
w、 writerow(row)
这是因为在原始代码中,它依赖于偏移量0的Truthy/Falsy值,在您之前的问题中,该值是第一个偏移量
例如,使用:
for offset in range(0, 10, 10):
if not offset:
第一个值0是一个伪值,而数字大于0(在本场景中),这将被视为真实值。如果不为真,即为假,即如果偏移量为0,则设置inf\u rest\u name
的值。这样可以确保其值只在第一个循环上设置,而不是每次都设置。它的值不会更改,因此无需再次读取
对于以下值,所有值都是真实值,因此永远不会设置inf\u rest\u name
for offset in range(40, 290, 10):
if not offset:
您可以更改为:
if offset == firstvalue:
e、 g
有关更多信息,请参阅
这些行还需要处理第一道汤,而不是后面的汤(因为这只是评论)
对于第一个代码块,您使用的是无效属性。应该是
ids = [review.get('data-reviewid') for review in reviews]
注意我添加了一个is None测试来处理notfound。这也应该添加到顶级版本中
import requests
from bs4 import BeautifulSoup as bs
with requests. Session() as s:
for offset in range (270, 1230, 10):
url = f'https://www.tripadvisor.fr/Restaurant_Review-g187147-d6575305-Reviews-or{offset}-Il_Etait_Un_Square-Paris_Ile_de_France.html'
r = s.get(url)
soup = bs(r.content, 'lxml')
if offset == 270:
inf_rest_name = soup.select_one('.heading').text.replace("\n","").strip()
rest_eclf = soup.select_one('.header_links a').text.strip()
reviews = soup.select('.reviewSelector')
ids = [review.get('data-reviewid') for review in reviews]
r = s.post(
'https://www.tripadvisor.fr/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS_RESP&metaReferer=',
data = {'reviews': ','.join(ids), 'contextChoice': 'DETAIL'},
headers = {'Referer': r.url}
)
soup = bs(r.content, 'lxml')
for review in soup.select('.reviewSelector'):
name_client= review.select_one('.info_text > div:first-child')
if name_client is None:
name_client = 'N/A'
else:
name_client = name_client.text.strip()
date_rev_cl = review.select_one('.ratingDate')
if date_rev_cl is None:
date_rev_cl = 'N/A'
else:
date_rev_cl = date_rev_cl['title'].strip()
titre_rev_cl = review.select_one('.noQuotes')
if titre_rev_cl is None:
titre_rev_cl = 'N/A'
else:
titre_rev_cl = titre_rev_cl.text.strip()
opinion_cl = review.select_one('.partial_entry')
if opinion_cl is None:
opinion_cl = 'N/A'
else:
opinion_cl = opinion_cl.text.replace("\n","").strip()
row = [f"{inf_rest_name}", f"{rest_eclf}", f"{name_client}", f"{date_rev_cl}", f"{titre_rev_cl}", f"{opinion_cl}"]
print(row)
评论不用于扩展讨论;这段对话已经结束。
ids = [review.get('data-reviewid') for review in reviews]
import requests
from bs4 import BeautifulSoup as bs
with requests. Session() as s:
for offset in range (270, 1230, 10):
url = f'https://www.tripadvisor.fr/Restaurant_Review-g187147-d6575305-Reviews-or{offset}-Il_Etait_Un_Square-Paris_Ile_de_France.html'
r = s.get(url)
soup = bs(r.content, 'lxml')
if offset == 270:
inf_rest_name = soup.select_one('.heading').text.replace("\n","").strip()
rest_eclf = soup.select_one('.header_links a').text.strip()
reviews = soup.select('.reviewSelector')
ids = [review.get('data-reviewid') for review in reviews]
r = s.post(
'https://www.tripadvisor.fr/OverlayWidgetAjax?Mode=EXPANDED_HOTEL_REVIEWS_RESP&metaReferer=',
data = {'reviews': ','.join(ids), 'contextChoice': 'DETAIL'},
headers = {'Referer': r.url}
)
soup = bs(r.content, 'lxml')
for review in soup.select('.reviewSelector'):
name_client= review.select_one('.info_text > div:first-child')
if name_client is None:
name_client = 'N/A'
else:
name_client = name_client.text.strip()
date_rev_cl = review.select_one('.ratingDate')
if date_rev_cl is None:
date_rev_cl = 'N/A'
else:
date_rev_cl = date_rev_cl['title'].strip()
titre_rev_cl = review.select_one('.noQuotes')
if titre_rev_cl is None:
titre_rev_cl = 'N/A'
else:
titre_rev_cl = titre_rev_cl.text.strip()
opinion_cl = review.select_one('.partial_entry')
if opinion_cl is None:
opinion_cl = 'N/A'
else:
opinion_cl = opinion_cl.text.replace("\n","").strip()
row = [f"{inf_rest_name}", f"{rest_eclf}", f"{name_client}", f"{date_rev_cl}", f"{titre_rev_cl}", f"{opinion_cl}"]
print(row)