Получить следующий html элемент с селеном - python - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующее html тело, которое дает список элементов. Пожалуйста, имейте в виду, что это html только для демонстрации. В самом теле, список содержит более 20 свойств.

<dl>
   <dt class="sc-ellipsis">Merk</dt>
   <dd>
       <a href="https://www.autoscout24.nl/auto/audi/">Audi</a>
   </dd>
   <dt class="sc-ellipsis">Model</dt>
   <dd>
       <a href="/lst/audi/q3">Q3</a>
   </dd> ....more properties like that
</dl>

Я хотел бы получить слова: Audi и Q3

Я могу просто сделать это в Selenium:

browser.find_elements_by_css_selector('dd')[0].text # to get Audi
browser.find_elements_by_css_selector('dd')[1].text # to get Q3

НО иногда некоторые элементы могут отсутствовать, поэтому я не могу полагаться на положение, упомянутое выше. Например, если Audi отсутствует, то это:

browser.find_elements_by_css_selector('dd')[0].text # now it returns Q3

возвращает Q3 . Один общий шаблон заключается в том, что Audi всегда будет следовать Merk * ​​1025 *, а Q3 всегда будет следовать Model . А именно, если Merk * ​​1031 * нет в корпусе html, Audi тоже не будет. Я попытался найти следующий элемент html Merk:

WebDriverWait(browser, 10).until(EC.visibility_of_all_elements_located((By.XPATH, './/[(@class="sc-ellipsis") and (text()="Merk")]/following-sibling::dd')))[0].text

Но это возвращает пустой список, что означает, что он не нашел Audi . Кто-нибудь знает, как получить следующий элемент Merk (или Model, или что-то еще в списке)? Я могу создать ловушку самостоятельно, поэтому, если Мерк не входит в список, не пытайтесь получить следующий элемент.

Заранее спасибо.

1 Ответ

1 голос
/ 25 апреля 2020

Следующий код вернет текст dd после dt с текстом «Merk»

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.autoscout24.nl/aanbod/audi-q3-sportback-pro-line-business-35-tfsi-110-kw-150-p-benzine-zilver-757ef256-c967-457b-8db1-4cb8b287c311?cldtidx=19')
elem = browser.find_element_by_xpath('//dt[text()="Merk"]/following-sibling::dd')
print(elem.text)

После изучения вашего кода, похоже, единственной проблемой было то, что вы не указали тип тега первый тег. Либо используйте подстановочный знак, либо dt.

'.//*[(@class="sc-ellipsis") and (text()="Merk")]/following-sibling::dd'
'.//dt[(@class="sc-ellipsis") and (text()="Merk")]/following-sibling::dd'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...