Как извлечь данные из следующего HTML?

HTML-код, из которого я хочу извлечь данные:

  <div class="infoMessageInner">
    <p>
      <span ng-bind-html="servicesCtrl.texts.addressInfo" class="ng-binding">
        Fiber är beställd till adressen. Tjänsterna kan du beställa när installationen är färdig.
      </span>
      <span ng-show="servicesCtrl.address.status === 'Orderable'" class="ng-hide">
        <a ng-click="servicesCtrl.preScrollToVerticalPosition('checkout', 'checkout', '/checkoutFiber', undefined, 'Checkout fiber')">Till&nbsp;fiberbeställningen
        </a>
      </span>
      <span ng-show="servicesCtrl.address.status === 'Inquireable'" class="ng-hide">
        <a ng-click="servicesCtrl.preScrollToVerticalPosition('checkout', 'checkout', '/inquiry', undefined, 'Inquiry')">Till&nbsp;intresseanmälan</a>
      </span>
    </p>
  </div>

** Я хочу извлечь данные только из 1-го диапазона. До сих пор я уже опубликовал и получил решение, но снова проблема не устранена, я получаю пустой список веб-элементов Selenium. **

Фрагмент кода: (с использованием Python-Selenium)

driver.find_elements_by_css_selector('div.infoMessageInner > p')
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.infoMessageInner > p')))
data = driver.find_elements_by_css_selector('div.infoMessageInner > p')

пожалуйста, помогите и извините за публикацию такого вопроса, потому что я изучаю селен.


person GigaByte    schedule 18.06.2018    source источник


Ответы (3)


Чтобы извлечь текст Fiber är beställd till adressen. Tjänsterna kan du beställa när installationen är färdig. только с 1-го промежутка вам нужно вызвать WebDriverWait, чтобы текст присутствовал в элементе, и вы можете используйте следующее решение:

  • Импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Строка кода:

    #Option 1 - text_to_be_present_in_element and CSS_SELECTOR
    element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "div.infoMessageInner>p>span.ng-binding"), "Fiber är beställd till adressen"))
    #Option 2 - text_to_be_present_in_element_value and CSS_SELECTOR
    element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR, "div.infoMessageInner>p>span.ng-binding"), "Fiber är beställd till adressen"))
    #Option 3 - text_to_be_present_in_element and XPATH
    element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element((By.XPATH, "//div[@class='infoMessageInner']/p/span[@class='ng-binding']"), "Fiber är beställd till adressen"))
    #Option 4 - text_to_be_present_in_element_value and XPATH
    element = WebDriverWait(driver, 20).until(EC.text_to_be_present_in_element_value((By.XPATH, "//div[@class='infoMessageInner']/p/span[@class='ng-binding']"), "Fiber är beställd till adressen"))
    
  • Текст будет:

    Fiber är beställd till adressen. Tjänsterna kan du beställa när installationen är färdig.
    
person DebanjanB    schedule 18.06.2018
comment
IDE отмечает как ошибку: "ожидаемое_условие". Почему? - person GigaByte; 18.06.2018
comment
из предыдущего импорта он работает сейчас, но иногда дает пустой результат ... хотя текст доступен в диапазоне. и спасибо за помощь во второй раз. - person GigaByte; 18.06.2018
comment
Я использовал предложенный вами селектор css предыдущего кода (который вы опубликовали) в своем коде, и он начал работать. - person GigaByte; 18.06.2018
comment
сэр, это исключение тайм-аута - person GigaByte; 18.06.2018

Если у вас больше нет <span> элементов в html, вы можете просто найти первый элемент диапазона с помощью driver.find_element_by_tag_name('span').text

person Yakir Tsuberi    schedule 18.06.2018
comment
Ах..но есть и другие пролеты разные присутствуют - person GigaByte; 18.06.2018
comment
так что вы можете найти весь диапазон в div с классом infoMessageInner: driver.find_element_by_class_name('infoMessageInner').find_element_by_tag_name('span').text - person Yakir Tsuberi; 18.06.2018
comment
Да, это что-то новое для меня, позволь мне попробовать. - person GigaByte; 18.06.2018

Вы можете использовать привязки ниже в селекторе CSS

.ng-binding

Редактировать:

driver.find_element_by_css_selector('.ng-binding').text
person Prany    schedule 18.06.2018
comment
Вы использовали .text после этого селектора CSS? - person Prany; 18.06.2018
comment
да, сэр, я пробовал, и я думаю, что он говорит о тайм-ауте, потому что не нашел, что происходит исключение тайм-аута элемента - person GigaByte; 18.06.2018