Извлечь ребенка первого периода с селеном - PullRequest
1 голос
/ 25 октября 2019

Я хочу извлечь первое span с текстом Extract this text. Уже попробовал:

element.find_element_by_css_selector(".moreContent span:nth-child(1)").text.strip('"')

Это не работает, я не уверен почему. Вывод просто пуст.

<p class="mainText">
  Lorem Ipsum is simply dummy text of the printing and typesetting industry.
  <span class="moreEllipses">…&nbsp;</span>
  <span class="moreContent">
    <span> Extract this text </span>
    <span class="link moreLink">Show More</span>
  </span>
</p>

Однако я получаю это, поэтому Selenium находит элемент, но почему вывод пуст:

<selenium.webdriver.remote.webelement.WebElement (session="e7012b303842651848aa0b0e40f5d5c1", element="df5644e9-fc98-4300-ad86-9ff433154d82")>

РЕДАКТИРОВАТЬ:

Мне удалось решить эту проблему, нажав кнопку Показать больше. По какой-то причине я не могу извлечь содержимое, если оно не отображается, даже если оно присутствует на странице.

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Чтобы извлечь текст из первого <span>, т. Е. Извлечь этот текст , вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любой из следующих Стратегии локатора :

  • Использование CSS_SELECTOR и text Свойство:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.mainText span.moreContent>span"))).text)
    
  • Использование XPATH и get_attribute() метод:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//p[@class='mainText']//span[@class='moreContent']/span"))).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
    
0 голосов
/ 25 октября 2019

В соответствии с вашим cssSelector кажется, что вы нацеливаетесь ниже

<span> Extract this text </span>

Вы можете использовать ниже Xpath:

(//p[@class='mainText']//span[@class='moreContent']/span)[1]

ИЛИ

(//span[@class='moreContent']/span)[1]

Пример кода:

element = driver.find_element_by_xpath("(//p[@class='mainText']//span[@class='moreContent']/span)[1]").text
...