如何提取 <ul> 下的所有 <li> 元素

How to extract all <li> elements under <ul>

我想提取我尝试

<ul> 下的所有 <li> 元素文本
elem = driver.find_elements_by_xpath(("//div[@class='left width50']/p/b/ul"))
len(elem)

给出“0”或空列表。

这里是 html 来源

<div class="left width50">
                            <p><b>Features:</b></p>
                            <ul>
                                    <li>Easy spray application</li>
                                    <li>Excellent bonding properties</li>
                                    <li>Single package</li>
                                    <li>Mixed with clean potable water at job site</li>
                            </ul>
                        </div>

这里是网站link

如何去做有什么建议吗?

实际上您正在尝试查找 pb 标记之后的路径。看起来像这样。

<div class="left width50">
    <p><b>Features:<ul>
            <li>Easy spray application</li>
            <li>Excellent bonding properties</li>
            <li>Single package</li>
            <li>Mixed with clean potable water at job site</li>
    </ul></b></p>

</div>

但是您的代码在 HTML 中有所不同。

所以你应该在没有 pb 标签的情况下四处看看。

这是您可以从 chrome 获得的快速帮助。使用 f12 key 转到开发人员选项并导航到元素选项卡,然后右键单击要查找的元素和 select select 或值。

您可以阅读更多关于查找元素的方法here

如果您想使用 xPath 这是适合您的 xpath - //*[@id="borderForGrid"]/div[1]/ul

提取过程

一旦你获得所有 ul 这将帮助你获得所有 li 文本

all_li = all_ul_from_xpath.find_elements_by_tag_name("li")
for li in all_li:
    text = li.text
    print (text)

工作代码供参考。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.carboline.com/products/")



elem = driver.find_element_by_xpath('//*[@id="borderForGrid"]/div[1]/ul')

all_li = elem.find_elements_by_tag_name("li")
for li in all_li:
    text = li.text
    print (text)

输出

xpath 中没有元素:

//div[@class='left width50']/p/b/ul 

left width50 有 500 个与之关联的网络元素。 //div[@class='left width50']/p/b

也是

这就是您在执行 len() 时得到 0 的原因。

尝试用这个 xpath 替换它

//a[text()='A/D Firefilm III']/../following-sibling::div[1]/descendant::li

据推测,您想要提取与 <h5> 标签关联的所有 <li> 元素的文本,文本为 A/D TC-55 SEALER 并为此可以使用以下任一项 :

  • 使用CSS_SELECTOR:

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "li[data-brands='Southwest'][data-types='Acrylics'] div.left.width50 ul>li")))])
    
  • 使用XPATH:

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//h5//a[text()='A/D TC-55 SEALER']//following::div[1]//ul//li")))])
    
  • 注意:您必须添加以下导入:

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