如何提取 <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
如何去做有什么建议吗?
实际上您正在尝试查找 p
和 b
标记之后的路径。看起来像这样。
<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 中有所不同。
所以你应该在没有 p
和 b
标签的情况下四处看看。
这是您可以从 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
我想提取我尝试
<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
如何去做有什么建议吗?
实际上您正在尝试查找 p
和 b
标记之后的路径。看起来像这样。
<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 中有所不同。
所以你应该在没有 p
和 b
标签的情况下四处看看。
这是您可以从 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