确定两个 html 元素是否是兄弟姐妹
Determine if two html elements are siblings
所以,我正在构建一个小实用程序来自动从任何文章样式的页面中抓取文本。我对如何最好地解决问题的想法是找到所有超过 ~150 个文本字符的元素:
document.xpath("//*[string-length( text() ) > 150 ]")
然后我得到一个元素列表,我想确定哪些元素是兄弟元素,但如果可能的话,为了效率,我想避免做更多的 DOM 遍历。
在 lxml 中有一些好的方法可以做到这一点吗?
给定一些节点列表 l
,您可以检查任何一对元素的 parent 是否相同(其中 parent 是通过 .getparent()
获得的) :
def get_siblings(l):
for a in l:
for b in l:
if a < b: # this tests the elements' memory addresses,
# so we don't get duplicate pairs or test
# elements against themselves
if a.getparent() == b.getparent():
yield (a, b)
或者更简单:
def get_siblings(l):
return ((a, b) for a in l
for b in l
if a < b
and a.getparent() == b.getparent())
您还可以使用计数器查找具有多个同级的 parent,然后查找具有这些 parent 的元素:
from collections import Counter
def get_siblings(l):
c = Counter([x.getparent() for x in l])
return [x for x in l if c[x.getparent()] > 1]
所以,我正在构建一个小实用程序来自动从任何文章样式的页面中抓取文本。我对如何最好地解决问题的想法是找到所有超过 ~150 个文本字符的元素:
document.xpath("//*[string-length( text() ) > 150 ]")
然后我得到一个元素列表,我想确定哪些元素是兄弟元素,但如果可能的话,为了效率,我想避免做更多的 DOM 遍历。
在 lxml 中有一些好的方法可以做到这一点吗?
给定一些节点列表 l
,您可以检查任何一对元素的 parent 是否相同(其中 parent 是通过 .getparent()
获得的) :
def get_siblings(l):
for a in l:
for b in l:
if a < b: # this tests the elements' memory addresses,
# so we don't get duplicate pairs or test
# elements against themselves
if a.getparent() == b.getparent():
yield (a, b)
或者更简单:
def get_siblings(l):
return ((a, b) for a in l
for b in l
if a < b
and a.getparent() == b.getparent())
您还可以使用计数器查找具有多个同级的 parent,然后查找具有这些 parent 的元素:
from collections import Counter
def get_siblings(l):
c = Counter([x.getparent() for x in l])
return [x for x in l if c[x.getparent()] > 1]