我正在尝试从雅虎新闻收集评论,但无法使用 Selenium 找到评论部分的文本元素。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
test = "https://www.yahoo.com/news/cdc-advisers-recommend-spring-covid-215003196.html"
# open comments
driver = webdriver.Chrome()
driver.get(test)
comment_button = driver.find_element(By.XPATH, '//a[@class="link caas-button noborder caas-tooltip flickrComment caas-comment top"]')
comment_button.click()
我可以单击评论按钮(以便将其打开),到目前为止这部分没有问题。但是,我很难找到评论部分的文字。
红色部分是我想要查找的示例,这是该部分的压缩 html。
<div class="components-MessageContent-index__messageEntitiesWrapper">
<div class="components-MessageContent-components-MessageEntities-MessageEntities__message-entities components-MessageContent-components-MessageEntities-MessageEntities__is-column">
<span class="Typography__text--11-4-15 Typography__t4--11-4-15 Typography__l6--11-4-15">
<div data-spot-im-class="message-text">
<p>...</p>
</div>
</span>
</div>
</div>
我尝试了以下不同的元素,但没有一个起作用。
# 1
driver.find_element(By.XPATH, '//div[@class="components-MessageContent-index__messageEntitiesWrapper"]')
# 2
driver.find_element(By.XPATH, '//div[@class="components-MessageContent-components-MessageEntities-MessageEntities__message-entities components-MessageContent-components-MessageEntities-MessageEntities__is-column"]')
# 3
driver.find_element(By.XPATH, '//span[@class="Typography__text--11-4-15 Typography__t4--11-4-15 Typography__l6--11-4-15"]')
# 4
driver.find_element(By.XPATH, '//div[@data-spot-im-class="message-text"]')
我也尝试过
driver.find_elements(By.XPATH, '')
driver.find_element(By.CLASS_NAME, '')
driver.find_elements(By.CLASS_NAME, '')
但它们也不起作用。我收到一条错误消息,如下所示;
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class="components-MessageContent-index__messageEntitiesWrapper"]"}
我是否输入了错误的 Xpath,或者我应该使用 Xpath 之外的其他语法?或者说使用 Selenium 基本上不可能抓取这个网站的评论部分?我将不胜感激任何有关此事的帮助。谢谢!
问题在于评论元素位于影子根内部。要访问它们,您需要切换到影子根元素,然后找到您想要的元素。
shadow_host = driver.find_element(By.CSS_SELECTOR, '#spotim-specific > div > div')
shadow_root = shadow_host.shadow_root
message = shadow_root.find_element(By.CSS_SELECTOR, 'div.components-MessageContent-index__messageEntitiesWrapper')