我正试图从此网站获得Booking.com评论的标题:
https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75,
其中r_lang=all
基本上表示网站应以每种语言显示评论。
为了从此页面获取标题,我这样做:
from urllib.request import urlopen
from bs4 import BeautifulSoup
page = urlopen(url)
soup = BeautifulSoup(page)
reviews = soup.findAll("li", {"class": "review_item clearfix "})
for review in reviews:
print(review.find("div", {"class": "review_item_header_content"}).text)
在网站上(请参见屏幕截图),前两个标题应为“ Sencillamente placentera”和“可能很棒”。但是,以某种方式,URL仅以西班牙语加载注释: “胎盘胎盘菌”
“ laatenciónde la chica del restaurante”
“ El desayuno estilo自助餐,完全”
“我是gusto laubicación,您是vista。”
“ Suubicaciónes muy buena”。
我注意到,如果在URL中,我会更改“ museo.es”。到“ museo.en。”,我得到了英文注释的标题。但这是不一致的,因为如果我加载原始URL,则会收到英文,法文,西班牙文等的注释。如何解决此问题?谢谢
答案 0 :(得分:2)
可以将服务器配置为基于发出请求的浏览器发送不同的响应。添加User-Agent
似乎可以解决问题。
import urllib.request
from bs4 import BeautifulSoup
url='https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75'
req = urllib.request.Request(
url,
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36',
}
)
f = urllib.request.urlopen(req)
soup = BeautifulSoup(f.read().decode('utf-8'),'html.parser')
reviews = soup.findAll("li", {"class": "review_item clearfix "})
for review in reviews:
print(review.find("div", {"class": "review_item_header_content"}).text)
输出:
“Sencillamente placentera”
“It could had been great.”
“will never stay their in the future.”
“Hôtel bien situé.”
...
答案 1 :(得分:1)
您始终可以将浏览器用作计划B。硒不存在此问题
from selenium import webdriver
d = webdriver.Chrome()
d.get('https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75')
titles = [item.text for item in d.find_elements_by_css_selector('.review_item_review_header [itemprop=name]')]
print(titles)