使用python和Selenium,我无法抓取本网站上任何插入JavaScript的数据。我在其他网站上用动态生成的内容测试了我的代码,它似乎很有效,所以我想知道这是否是JS在这个网站上生成的特定方式?
我想在网站上查一下这个商品的库存情况。下面的代码生成以下异常:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id="theList"]/article[1]//div[@class="order"]/div/text()"}
,但我知道这个xpath是在chrome-dev工具中尝试的。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
elem = driver.find_element(
By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]')
print(elem.text)
阅读相关的SO帖子,我想可能是我需要手动告诉驱动程序等待页面加载,所以我尝试了这个:
service = Service(ChromeDriverManager().install())
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.deejay.de/velvet+velour')
try:
elem = WebDriverWait(driver=driver, timeout=20).until(
lambda x: x.find_element(By.XPATH, '//div[@id="theList"]/article[1]//div[@class="order"]/div[1]'))
print(elem.text)
except TimeoutException:
print('took too long')
但它总是超时,并返回我的异常消息。
有什么想法为什么这可能不起作用吗?正如我所说,由于某种原因,我可以从其他网站获得JS生成的代码,但不能从deejay.de获得
您需要先切换到iframe。
iframe = WebDriverWait(driver, 30).until(EC.presence_of_element_located(
(By.XPATH, "//iframe[@id='myIframe']")))
driver.switch_to.frame(iframe)
然后找到所有的项目并像这个一样打印它们的库存
items = driver.find_elements(By.XPATH, "//div[@class='order']/div[1]")
for item in items:
print(item.text)
最后切换回默认内容以访问iframe 之外的元素
driver.switch_to.default_content()
注意:您需要导入以下
from selenium.webdriver.support import expected_conditions as EC