Python 3.x 显示两个差异é;使用我用来刮取其他页面的相同代码出租错误

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\

我使用了一个代码从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\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)