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

时间:2018-08-08 14:15:38

标签: python beautifulsoup lxml

我使用lxml执行xpath以获得etree._Element类型的节点。 我也有一些bs4.Tag类型的节点。

然后,我想知道这两个节点是否引用相同的HTML元素。最好的方法是什么?

我目前所做的是一种非常简单的方法,可以检查以下各项(例如)的相等性:

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

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

但是,这不方便。

1 个答案:

答案 0 :(得分:1)

此代码可以帮助您比较最多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