python - 尝试使用 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)
请问有什么帮助吗?提前致谢!
解决方案
问题很简单。
评论标签是隐藏的,只有在页面加载时才会出现(我不擅长网络,我不知道他们如何称呼这项技术)。
因此,当您选择--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
,则会出现错误。
推荐阅读
- sql - sql server中数值改变精度时如何解决问题
- bash - 计算每列中非空条目的数量,例如 comm 输出
- amazon-s3 - 在 GStreamer 中,我使用“s3src”将 mp4 从 Amazon S3 获取到我的计算机。为什么文件大小发生了变化?
- javascript - 从子文件夹导入动态 Vue
- asp.net-core - 如何读取字符串数据并仅从中获取数字并将其存储在列表中
- c - 重新排序双精度类型数据
- sql - 如何在 SWITCH 语句中设置范围?
- python - 用 Python 替换 JSON 文件中的字符。由于大文件(超过 1 GB)而导致编辑问题
- ios - NWConnection 发送多个数据报
- python - 比 iterrows 迭代 df 并设置另一个列值的更好方法