检查 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 元素。执行此操作的最佳方法是什么?
我目前做的是一种非常简单的方法来检查以下事物的相等性(例如):
- 标签名称
- HTML属性如id,class等
- 字符串内容
...
或者只是从根到该节点的规范路径。
然而,这并不方便。
此代码可以帮助您比较 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
我使用 lxml 执行 xpath 来获取 etree._Element 类型的节点。 我还有一些 bs4.Tag.
类型的节点然后我想知道这两个节点是否指的是同一个 HTML 元素。执行此操作的最佳方法是什么?
我目前做的是一种非常简单的方法来检查以下事物的相等性(例如):
- 标签名称
- HTML属性如id,class等
- 字符串内容 ...
或者只是从根到该节点的规范路径。
然而,这并不方便。
此代码可以帮助您比较 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