在Python中使用selenium提取javascript渲染页面中span标签之间的文本

问题描述 投票:0回答:1

我正在尝试抓取动态更新的网页上具有特定类的标签之间的所有文本实例。我在 python 中使用 selenium 和 chrome webdriver。

在普通浏览器中,如果我右键单击我想要的元素并转到“开发人员工具>检查”,我可以看到我想要的标签,例如:

<span class="sCell valX poolX">2112</span>

数字 2112 就是我想要的。它们嵌套在数十个其他外部标签中。请注意,如果我在浏览器中选择“页面源”而不是“检查”,则会显示:

<span class="sCell valX poolX" <% if(poolState !== "Y"){%> style="display: none"<%}%>><%=xPool%></span>

问题是当我使用 xPath 查找此信息时,我得到一个空数组。

这是我尝试过的最简单迭代中的相关代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

options = Options()
options.headless = True
driver = webdriver.Chrome(
    options=options, 
    executable_path=chrome_path
)

x_path = '//span[@class="sCell valX poolX"]'

wait = WebDriverWait(driver, 20)
driver.get(url)

wp = driver.find_elements(By.XPATH, x_path)

for n in wp: 
     print(wp.text)

我收到错误:

AttributeError: 'list' object has no attribute 'text'

请注意,当我使用时:

from selenium.webdriver.support import expected_conditions as EC

wait.until(EC.visibility_of_element_located((By.XPATH, x_path)))

我得到一个

TimeoutException


我忍不住假设我在这里遗漏了一些非常简单的东西。我对此没有太多经验,但这似乎是一个简单的刮擦。

请注意,如果我打印

driver.page_source
,我会得到与“开发人员工具>页面源”相同的标签:

<span class="sCell valX poolX" <% if(poolState !== "Y"){%> style="display: none"<%}%>><%=xPool%></span>
javascript python selenium-webdriver web-scraping xpath
1个回答
0
投票

首先,如果您使用“WebDriverWait”等待页面加载,那么您应该在“driver.get”之后执行此操作。其次,你的for循环是错误的,将“wp.text”更改为“n.text”。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

options = Options()
options.headless = True
driver = webdriver.Chrome(
    options=options, 
    executable_path=chrome_path
)

x_path = '//span[@class="sCell valX poolX"]'

driver.get(url)
wait = WebDriverWait(driver, 200)

wp = driver.find_elements(By.XPATH, x_path)

for n in wp: 
     print(n.text)
© www.soinside.com 2019 - 2024. All rights reserved.