【问题标题】:Grabbing text from a list with no ID or class using Selenium使用 Selenium 从没有 ID 或类的列表中获取文本
【发布时间】:2018-11-13 12:20:03
【问题描述】:

当我确定使用正确的Xpath 时,我不明白为什么我试图从中提取文本的列表返回空白。这是我的代码:

driver = webdriver.Firefox()
driver.get("https://www.omegawatches.com/watch-omega-specialities-first-omega-wrist-chronograph-51652483004001")
betweenLugs = driver.find_elements(By.XPATH, "/html/body/div[2]/main/div[3]/div/div/div[2]/div/div[2]/div[3]/div/ul/li[1]")])
print(betweenLugs.text)

这应该获取第一个列表项和度量

Between lugs: 20 mm 

我也尝试过其他方法,但是Xpath 没有收到它的事实告诉我有问题,不管我怎么做,我都无法提取里面的文字列表。有谁知道我做错了什么?这是我第一次遇到这个问题。

【问题讨论】:

  • 我认为这行应该是: betweenLugs = driver.find_elements(By.XPATH, "/html/body/div[2]/main/div[3]/div/div/div[2 ]/div/div[2]/div[3]/div/ul/li")])[0]
  • 无序列表中的每个列表项都与技术信息有关,因此可以是从“Between Lugs”一直到“Water Resistant”以及与标题。
  • @Alichino 不幸的是只打印空白;没有错误或内容。在尝试不同的事情时,我也遇到了这个问题。我不知道为什么。

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

xpath 是错误的。它在/div[2] 中失败,它不匹配任何东西。这是一个不应使用绝对路径的示例。

该部分有id属性,使用它

betweenLugs = driver.find_elements(By.XPATH, "//*[@id='product-info-data-5bea7fa7406d7']/ul/li[1]")[0]

您可能还想添加一些等待加载

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

betweenLugs = WebDriverWait(driver, 10).until(expected_conditions.visibility_of_element_located((By.XPATH, "//*[@id='product-info-data-5bea7fa7406d7']/ul/li[1]")))

【讨论】:

  • 这是一个更好的主意,我会尝试使用您的建议,但是当使用 [0] 进行索引时,我收到错误“列表索引超出范围。”
  • @LRBrady 可能是时间问题,我更新了答案。
  • 我很欣赏编辑,我不确定这是一个时间问题,因为即使进行了编辑,selenium 也只是超时并且没有找到任何东西。我会继续你的建议并尝试做出一些改变。
  • @LRBrady 尝试最大化窗口driver.maximize_window(),驱动初始化后调用。
  • @Guy 它似乎仍然超时,这个文本很难掌握,但我认为另一个答案给出了最好的结果。感谢您的帮助。
【解决方案2】:

好的,试试这个,看看能不能解决问题:

between_lugs = driver.find_element_by_xpath("//*[contains(text(), 'Between lugs')]").get_attribute("innerHTML")
between_lugs_value = driver.find_element_by_xpath("//*[contains(text(), 'Between lugs')]/../span").get_attribute("innerHTML")

final_text = between_lugs + " " + between_lugs_value

【讨论】:

  • 谢谢,但不幸的是这会返回:“selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //*[contains(text(), 'Between lugs')]”跨度>
  • 它在 python 解释器中对我有用...请再次复制您所在的 URL :)
  • 我明白了,我想这是因为我的浏览器会自动将它带到德国网站。我给的链​​接是美国的,所以这可能就是原因。我的错。网址在这里:omegawatches.com/de/…,但我认为如果我相应地更改一些内容,它应该可以工作。
  • 我认为应该 :) 或者将 CONTAINS 中的文本更改为“Zwischen den Bandanstößen”:D PS。此外,该值在   形式的数字后面有一个空格。 -- 你可以这样做 between_lugs_value = between_lugs_value.replace(" "," ")
  • 是的,这几乎可以满足我的需要,只需要去掉一些东西,否则看起来不错。谢谢
【解决方案3】:

该页面上已经有 jQuery,因此您可以:

driver.execute_script("return jQuery('li:contains(Between lugs)').text().trim().replace(/\s+/g, ' ')")

您可以在 chrome 选择器中摆弄选择器,这样会更容易。

【讨论】:

  • 非常有趣。谢谢。
【解决方案4】:

另一种更简单的方法可能如下:

from contextlib import closing
from selenium import webdriver
from selenium.webdriver.support import ui

url = "https://www.omegawatches.com/watch-omega-specialities-first-omega-wrist-chronograph-51652483004001"

with closing(webdriver.Chrome()) as wd:
    wait = ui.WebDriverWait(wd, 10)
    wd.get(url)
    item = wait.until(lambda wd: wd.find_element_by_xpath("//*[contains(@class,'technical-data')]//li")).get_attribute('textContent')
    print(' '.join(item.split()))

输出:

Between lugs: 20 mm

【讨论】:

  • 我发现它在一次打开和退出浏览器时非常方便@QHarr。谢谢。
【解决方案5】:

使用 css 选择器向下滚动和等待来定位父 li

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

driver = webdriver.Chrome() #Firefox()
driver.get("https://www.omegawatches.com/watch-omega-specialities-first-omega-wrist-chronograph-51652483004001")
driver.execute_script("window.scrollTo(0, 2000)") 
betweenLugs = WebDriverWait(driver, 10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#product-info-data-5beaf5497d916 > ul > li:nth-child(1)")))

print(betweenLugs.text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多