如何使用 <ul> 内的 python 网络抓取数据获取数据,但我没有类、ID 或名称,而且 xpath 也不相同?

时间:2021-01-05 14:28:00

标签: python selenium xpath css-selectors webdriverwait

嗯,我的问题是这个。我想使用 python 和 selenium 从网页中收集数据,这是我需要从中获取数据的 html

 <div class="order-detail order-price">
      <div>
        <p class="item-left text--semibold">
           Subtotal
        </p>
        <p class="item-right text--semibold">$1420.00</p>
     </div>
  </div>

<我需要的数据是来自最后一个“p”元素的内部文本,即数字。我可以将 Xpath 用于特定的,但这是在一个 ul elemten 中,它有很多 li 元素,在那些 li 中,你有那个 div 代码。

问题是每个 li 中该 div 的 Xpath 都会发生变化,因为我可以在该特定之前拥有或多或少的 div,所以我无法使用 Xpath,我没有 ID、名称和类名对于所有其他 div,我的程序无法抓取一个特定的。此外,我需要一个一个地抓取,以便我可以订购它们,因为每隔一段时间我必须收集另一个特定的 div 并将该数据保存在同一位置。 这是我目前的代码

ul_principal = driver.find_element_by_xpath('/html/body/main/div[5]/section/div/div/div/div/ul/li[2]/div/div/div[1]/div[4]/ul[2]')

li_options = ul_principal.find_elements_by_tag_name('li')
for li in li_options:

     driver.implicitly_wait(100)

     li.click()

     div_Subtotal = li.find.element_by_class_name("order=detail order-price")

     if div_Subtotal is not None:
       div_Subtotal.find_element_by_class_name("item-right text--semibold").get_property('innerText')

我使用 li.click() 来知道我是否可以在 li 内旅行,这有效,但我无法获取信息。 我不能给你这个网页,因为它有密码而且是私密的

2 个答案:

答案 0 :(得分:0)

尝试类似 BS4.find(class_ = "order-detail order-price").find("p", {"class": "item-right"}).text

答案 1 :(得分:0)

要提取和打印文本 $1420.00,您可以使用以下任一 Locator Strategies

  • 使用 css_selectorget_attribute()

    print(driver.find_element_by_css_selector("ul li div.order-detail.order-price p.item-right.text--semibold").get_attribute("innerHTML"))
    
  • 使用 xpathtext 属性:

    print(driver.find_element_by_xpath("//ul//li//div[@class='order-detail order-price']//p[@class='item-right text--semibold']").text)
    

理想情况下,您需要为 visibility_of_element_located() 引入 WebDriverWait,并且您可以使用以下任一 Locator Strategies

  • 使用 CSS_SELECTORtext 属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "ul li div.order-detail.order-price p.item-right.text--semibold"))).text)
    
  • 使用 XPATHget_attribute()

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//ul//li//div[@class='order-detail order-price']//p[@class='item-right text--semibold']"))).get_attribute("innerHTML"))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
<块引用>

您可以在 How to retrieve the text of a WebElement using Selenium - Python

中找到相关讨论

参考文献

链接到有用的文档: