Как извлечь все <li>элементов в <ul> - PullRequest
0 голосов
/ 03 июня 2019

Я хочу извлечь весь <li> текст элемента, который находится под <ul>, для которого я пробовал

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>

ЗДЕСЬ есть ссылка сайта

Как поступить по этому поводу с предложениями?

Ответы [ 3 ]

2 голосов
/ 03 июня 2019

На самом деле вы пытаетесь найти путь после тегов 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 и перейдите на вкладку элементов, а затем щелкните правой кнопкой мыши элемент, который вы хотите найти, и выберите значение селектора.

Вы можете узнать больше о том, как найти этот элемент здесь

Если вы хотите использовать 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)

Выход

enter image description here

enter image description here

1 голос
/ 03 июня 2019

Предположительно, вы хотели извлечь весь текст <li> элемента, связанный с тегом <h5>, с текстом 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
    
0 голосов
/ 03 июня 2019

Нет элемента с xpath:

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

left width50 имеет 500 веб-элементов, связанных с ним. Так же //div[@class='left width50']/p/b

Вот почему вы получаете 0 при выполнении len ().

Вместо этого попробуйте заменить его на этот xpath

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