首页 > 解决方案 > 尝试使用 BeautifulSoup 或 Xpath 抓取时无法找到 page_source 中的元素

问题描述

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

我找到了包含评论的容器,但是空的......

我通过使用 Chrome DevTools 检查页面来确保我正在寻找的元素存在

我什至从使用 scrapy_splash 切换到 selenium,以防前者可能错过任何动态内容,我还尝试使用 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)

请问有什么帮助吗?提前致谢!

标签: pythonseleniumxpathbeautifulsoupscrapy

解决方案


问题很简单。

评论标签是隐藏的,只有在页面加载时才会出现(我不擅长网络,我不知道他们如何称呼这项技术)。

因此,当您选择--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.headlessTrue,则会出现错误。


推荐阅读