Как я могу разобрать таблицу HTML, которая содержит различные типы объектов? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть HTML-таблица, которая содержит следующие типы объектов: текст, текстовое поле, список (выбрать) и кнопки (см. Прикрепленное изображение).
Моя цель - проанализировать, где это возможно, текст изТаблица.

Например, я бы хотел проанализировать столбцы User Name, Permission, SNMPv3 Auth и SNMPv3 Priv.The Table to Parse

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

Как бы вы предложили мне иметь дело с таблицами такого типа?

В примере кода я печатаю содержимое таблицы (текст), но на самом деле я буду хранить ее с целью анализа ее содержимого.Кстати, вы также можете видеть, что я не имею в виду первую строку (заголовок) таблицы.

Так пользователи могут просматривать строки списка, в которых есть только тег div enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

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

rows = driver.find_elements_by_css_selector("table#sec_user_table>tbody>tr")
for row in rows:
   cols = row.find_elements_by_css_selector("div,select")
   for col in cols:
       if col.tag_name == 'div':
           if col.text != '':
               print(col.text)
       elif col.tag_name == 'select':
           print(Select(col).first_selected_option.text)
0 голосов
/ 17 октября 2018

Согласно HTML, которым вы поделились, у каждого tr есть три элемента, текстовое поле, поле выбора и кнопка.

Также на снимке экрана для сохраненной записи я не вижу поля ввода.Например, текст user1.Я предполагаю, что user1 находится внутри тега span.как

<td>
 <div>user1</div>
</td> 

Вы должны обрабатывать каждый элемент по-разному, чтобы получить значение из него.

  • Чтобы получить innerText в div, мы должны использовать elem.text
  • Чтобы получить значение атрибута входного текстового поля, мы должны использовать elem.get_attribute('value')
  • Чтобы получить выбранное значение, мы должны использовать Select(elem).first_selected_option

Это пример кода, чтобы получить данные вашего домена.Пожалуйста, свободно редактировать в соответствии с вашими потребностями.Я использовал селекторы CSS, чтобы найти элементы.Смотрите здесь для синтаксиса.

# This returns all the tr elements in the table
rows = driver.find_elements_by_css_selector("table#sec_user_table>tbody>tr")
for i in range(1, len(rows)):
    # This returns only the span, input which is not password and select elements
    cols = rows[i].find_elements_by_xpath("td//*[self::div[not(.//input)] or self::input[@type='text'] or self::select]")
    for col in cols:
        if col.tag_name == 'SELECT':
            print(Select(col).first_selected_option.text) # To get the select value
        elif col.tag_name == 'INPUT':
            print(col.get_attribute('value'))    # To get the input value
        else:
            print(col.text)    # To get text fron span

или

Простое решение с одиночными селекторами:

Это относится кваш случай, поскольку вы не нуждаетесь в элементе ввода полностью

  # This returns all the tr elements in the table
    rows = driver.find_elements_by_css_selector("table#sec_user_table>tbody>tr")
    for i in range(1, len(rows)):
        username = rows[i].find_element_by_xpath("//div[not(.//input)]")
        print(username.text)

        select = rows[i].find_elements_by_css_selector("select")
        for col in cols:
            print(Select(col).first_selected_option.text) # To get the select value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...