Выбор элементов в одном узле - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу сценарии автоматизации Selenium на Python.Как процесс, мне нужно собрать некоторые элементы.Ниже приведен пример HTML (я отредактировал, чтобы выглядеть просто).Когда я выполняю поиск, я получаю результаты поиска, аналогичные приведенным ниже.

Теперь мне нужен список элементов в Restaurants и выполняются некоторые операции.Аналогично для баров, магазинов, кофе.

Дело в том, что lh и li находятся на одном уровне узлов.

Я пробовал следующий xpath, но он выбирает только элементы lh

//ul[@id='searchresults']//ancestor::lh

Я также прошел через полезные Понятие XML XLST предшествующий брат и предок .Но, не разобрались с решением

Пример HTML-кода:

<ul id="searchresults">
    <lh style="">Restaurants</lh>
    <li title="Chamber"><span>Chamber</span></li>
    <li title="Chillies"><span>Chillies</span></li>
    <li title="Sushi Ville"><span>Sushi Ville</span></li>
    <li title="Toasters"><span>Toasters</span></li>
    <li title="Joe Grills"><span>Joe Grills</span></li>
    <lh style="">Bars</lh>
    <li title="Y Cocktails"><span>Y Cocktails</span></li>
    <li title="Z Brewery"><span>Z Brewery</span></li>
    <li title="X Drinks"><span>X Drinks</span></li>
    <lh style="">Shopping</lh>
    <li title="Pacific"><span>Pacific</span></li>
    <li title="Spencers"><span>Spencers</span></li>
    <li title="Hays"><span>Hays</span></li>
    <lh style="">Coffee</lh>
    <li title="Roasters"><span>Roasters</span></li>
    <li title="Coffee Beans"><span>Coffee Beans</span></li>
    <li title="Coffee Cafe"><span>Coffee Cafe</span></li>
</ul>

Ваша помощь очень ценится, и, пожалуйста, дайте мне знать любую информацию, которая мне не хватает или нужна, которая поможет решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я подумал о чем-то простом, запустив какой-то javascript в сеансе, который добавит пользовательский атрибут с именем заголовка списка (LH) к каждому из следующих элементов списка (LI), вам нужно изменить имя пользовательского атрибутак вашим потребностям, не конфликтуя с текущими атрибутами.

my_js = """let currentLh;
document.querySelectorAll(arguments[0]).forEach(function (elem) {
    if (elem.tagName === "LH") {
        currentLh = elem.textContent.toLowerCase();
    } else {
        elem.setAttribute("my-custom-attr", currentLh);
    }
"""

driver.execute_script(my_js, 'ul#searchresults > *')
my_restaurant_list = driver.find_elemets_by_css_selector('li[my-custom-attr="restaurant"]')
my_bar_list = driver.find_elemets_by_css_selector('li[my-custom-attr="bars"]')
my_shopping_list = driver.find_elemets_by_css_selector('li[my-custom-attr="shopping"]')
my_coffee_list = driver.find_elemets_by_css_selector('li[my-custom-attr="coffee"]')

Используется функция JS NodeList.forEach, которая может быть недоступна во всех браузерах. Если вы обнаружите там проблему, вам нужно будет найти более портативное решение для зацикливания.для всех элементов в неупорядоченном списке.

0 голосов
/ 21 декабря 2018

Вы можете сделать следующее:

  • перебрать элементы "заголовка списка"
  • для каждого "заголовка списка", получить следующих братьев и сестер исобирать «теги» (давайте назовем эти li тексты элементов как «теги»), пока не будет встречен lh брат

Что-то вроде этих строк:

for lh in driver.find_elements_by_xpath("//ul[@id='searchresults']//lh"):
    restaurant = lh.text

    tags = []
    for element in lh.find_elements_by_xpath("./following-sibling::*"):
        if element.tag_name == 'lh':
            break

        tags.append(element.text)

    print(restaurant, tags)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...