尝试使用BeautifulSoup或Xpath进行抓取时,找不到page_source中的元素

时间:2020-07-20 16:34:40

标签: python selenium xpath beautifulsoup scrapy

我正在尝试爬行Booking.com网站以获取评论和酒店详细信息。我设法获得了酒店的详细信息,但是当涉及到爬行评论时,发生了一些奇怪的事情!

我找到了覆盖评论的容器,但是是空的...

通过使用Chrome DevTools检查页面,确保了我要查找的元素存在

为了防止前者错过任何动态内容,我什至从使用scrapy_splash切换到了硒,我还尝试使用BeautifulSoup和Xpath对其进行爬网。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

DRIVER_PATH = './chromedriver'
chrome_options = Options()
# chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options, executable_path=DRIVER_PATH)
driver.get("https://www.booking.com/hotel/tn/carlton-tunis.ar.html?label=gen173nr-1FCAEoggI46AdIM1gEaECIAQGYAQG4ARnIAQzYAQHoAQH4ARCIAgGoAgO4Ar351vgFwAIB0gIkNDUyNmFhZGQtODNkMy00Nzg1LWI3MzYtNWE4MzA5Y2RjY2Jk2AIG4AIB;dest_id=-731701;dest_type=city;dist=0;from_beach_non_key_ufi_sr=1;group_adults=2;group_children=0;hapos=1;hpos=1;no_rooms=1;room1=A%2CA;sb_price_type=total;sr_order=popularity;srepoch=1595260105;srpvid=1d9f6f249e3001d7;type=total;ucfs=1&#tab-reviews")
reviewsContainer = driver.find_element_by_xpath("//div[@id='review_list_page_container']/ul[@class='review_list']")

正如我所说,我遇到了找不到指定元素的错误

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id='review_list_page_container']/ul[@class='review_list']"}
  (Session info: headless chrome=84.0.4147.89)

有什么帮助吗?预先感谢!

2 个答案:

答案 0 :(得分:0)

问题很简单。

评论标签处于隐藏状态,仅在加载页面时才会显示(我在网络上并不擅长,也不知道他们如何称呼这项技术)。

因此,当您使用选项--headless以隐藏模式运行浏览器(不加载UI元素)时,该隐藏选项卡将不会加载;该页面应该被加载以创建它。

解决方案仅是禁用headless选项。我将您的代码更改为使用Firefox浏览器(很抱歉,我没有Chrome驱动程序:D):

import os, platform
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions

options = FirefoxOptions()
options.headless = False
driver = webdriver.Firefox(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.booking.com/hotel/tn/carlton-tunis.ar.html?label=gen173nr-1FCAEoggI46AdIM1gEaECIAQGYAQG4ARnIAQzYAQHoAQH4ARCIAgGoAgO4Ar351vgFwAIB0gIkNDUyNmFhZGQtODNkMy00Nzg1LWI3MzYtNWE4MzA5Y2RjY2Jk2AIG4AIB;dest_id=-731701;dest_type=city;dist=0;from_beach_non_key_ufi_sr=1;group_adults=2;group_children=0;hapos=1;hpos=1;no_rooms=1;room1=A%2CA;sb_price_type=total;sr_order=popularity;srepoch=1595260105;srpvid=1d9f6f249e3001d7;type=total;ucfs=1&#tab-reviews")
reviewsContainer = driver.find_element_by_xpath("//div[@id='review_list_page_container']/ul[@class='review_list']")

如果将options.headless更改为True,则会出现错误。

答案 1 :(得分:0)

我想我解决了这个问题:

我正在使用Fedora 32 Distro,仅在环境中安装Selenium是不够的。我必须使用SuperUser特权来安装它:

sudo pip install -U selenium

然后,我确定我的驱动程序目录位于PATH中,所以我在主目录中创建了一个目录,将Gecko和Chrome驱动程序移至了该目录,并将其添加到PATH中:

export BROWSER_DRIVERS="~/browser_drivers"
export PATH=$PATH:$BROWSER_DRIVERS

现在一切正常:无头,无头……谢谢您的帮助。