检查 etree._Element 和 bs4.Tag 是否相等的最佳方法是什么?

What is the best way to check the equality of a etree._Element and a bs4.Tag?

我使用 lxml 执行 xpath 来获取 etree._Element 类型的节点。 我还有一些 bs4.Tag.

类型的节点

然后我想知道这两个节点是否指的是同一个 HTML 元素。执行此操作的最佳方法是什么?

我目前做的是一种非常简单的方法来检查以下事物的相等性(例如):

  1. 标签名称
  2. HTML属性如id,class等
  3. 字符串内容 ...

或者只是从根到该节点的规范路径。

然而,这并不方便。

此代码可以帮助您比较 html 元素的路径,同时考虑标签和属性,但比较元素的文本非常棘手

def compare_elements(bs_tag, lxml_element):
    # running till the very top
    while bs_tag.name != 'html' and lxml_element.tag != 'html':
        # compare tag
        if bs_tag.name != lxml_element.tag:
            return False

        # compare attributes
        # bs groups into lists, so we need to join back to string
        bs_attrs = {k: ' '.join(v) if isinstance(v, list) else v for k, v in bs_tag.attrs.items()}
        if bs_attrs != lxml_element.attrib:
            return False

        # going up
        bs_tag = bs_tag.parent
        lxml_element = lxml_element.getparent()

    return True