如何解析包含不同对象类型的HTML表?

2024-09-28 23:20:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个HTML表,其中包含以下对象类型:文本、文本框、列表框(选择)和按钮(请参见附图)。
我的目的是尽可能解析表中的文本。你知道吗

例如,我想解析用户名、权限、SNMPv3 Auth和SNMPv3 Priv列。 The Table to Parse

对于列表框,我已经知道如何收集所选选项文本。
只包含文本的表对我来说是众所周知的,我知道如何很好地解析它们,但是我用来解析它们的方法不适合这种表。你知道吗

你建议我怎么处理这种桌子?你知道吗

在代码示例中,我打印了表的内容(文本),但实际上,我将存储它以分析其内容。顺便说一下,您还可以看到,我指的不是表的第一行(标题)。你知道吗

这是用户查看只有div标记的列表行的方式 enter image description here


Tags: 对象文本目的auth权限类型内容html
2条回答

根据您共享的html,每个tr有三个元素:文本框、selectbox和按钮。你知道吗

在保存的记录的屏幕截图中,我没有看到输入字段。例如,文本user1。我假设user1在一个span标记中。 就像

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

必须以不同的方式处理每个元素,才能从中获得值。你知道吗

  • 要在div中获取innerText,我们必须使用elem.text
  • 获取属性 输入文本框的值,我们必须使用elem.get_attribute('value')
  • 要获得选定的值,我们必须使用Select(elem).first_selected_option

这是一个示例代码,用于获取dom的数据。请根据您的需要自由编辑。 我使用css选择器来查找元素。在here中查找语法。你知道吗

# 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

我改进了上面的解决方案,以解决我的具体问题,它仍然可能需要一些调整,例如,我将需要考虑一种方法来忽略最后一行,但这不是一个大问题。我想解决的另一个问题是得到结果所需的时间。出于某种原因,它需要几秒钟

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)

相关问题 更多 >