【问题标题】:What is the best way to check the equality of a etree._Element and a bs4.Tag?检查 etree._Element 和 bs4.Tag 是否相等的最佳方法是什么?
【发布时间】:2019-01-15 20:26:52
【问题描述】:

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

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

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

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

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

但是,这并不方便。

【问题讨论】:

  • 这些都不能帮助您确定它们是否引用相同的 HTML 元素。您必须比较引导您到达它们的路径。
  • @intentionallyleftblank 确定....
  • 为什么不选择一个库并坚持下去?
  • @pguardiario 我想用bs4提供的约定函数来处理DOM树,但是不能执行xpath。
  • 契约函数?我认为你编造了。

标签: python beautifulsoup lxml


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2020-12-08
    • 1970-01-01
    • 2015-03-31
    • 2011-05-25
    • 2012-08-29
    相关资源
    最近更新 更多