Python 如何在lxml中查找元素的直接子元素
我发现一个具有特定类的对象:Python 如何在lxml中查找元素的直接子元素,python,xpath,lxml,Python,Xpath,Lxml,我发现一个具有特定类的对象: THREAD = TREE.find_class('thread')[0] 现在,我想获取作为其直接子元素的所有元素 我累了: THREAD.findall("p") THREAD.xpath("//div[@class='thread']/p") 但所有这些都会返回此中的所有元素,无论该是否为其最近的父元素 我怎样才能让它工作 编辑: 示例html: <div class='thread'> <p> <!-- 1 --&g
THREAD = TREE.find_class('thread')[0]
现在,我想获取作为其直接子元素的所有
元素
我累了:
THREAD.findall("p")
THREAD.xpath("//div[@class='thread']/p")
但所有这些都会返回此
中的所有
元素,无论该
是否为其最近的父元素
我怎样才能让它工作
编辑:
示例html:
<div class='thread'>
<p> <!-- 1 -->
<!-- Can be some others <p> objects inside, which should not be counted -->
</p>
<p><!-- 2 --></p>
</div>
<div class='thread'>
<p>[...]</p>
<p>[...]</p>
</div>
[……]
[……]
脚本应该找到两个对象
,它们是线程的子对象。我应该会收到两个对象的列表,在示例HTML的注释中标记为“1”和“2”
编辑2:
还有一个澄清,因为人们感到困惑:
THREAD
是存储在变量中的某个对象,可以是任何html元素。我想找到
对象,这些对象是线程的直接子对象。那些
不能在线程
之外,也不能在线程
之内的任何元素之内,请尝试以下XPath表达式:
//p[parent::div[@class='thread']]
THREAD.xpath("//p[parent::div[@class='thread']]")
div[@class='thread']/child::p"
或者在完整的Python表达式中:
//p[parent::div[@class='thread']]
THREAD.xpath("//p[parent::div[@class='thread']]")
div[@class='thread']/child::p"
另一种(反向)方法是XPath表达式:
//p[parent::div[@class='thread']]
THREAD.xpath("//p[parent::div[@class='thread']]")
div[@class='thread']/child::p"
它使用直接子节点::
轴并仅选择直接子节点
总结:
这两个表达式中哪一个更快取决于XPath编译器<代码>子轴::
是默认轴,如果未指定其他轴,则使用该轴
仅供参考:XPath计数从1开始,而不是0开始
因此,关于XML示例,下面的表达式
count(//div[@class='thread'][1]/child::p)
结果的值为2-计数的结果 我不确定,但您的问题似乎在于HTML本身:请注意,段落的结束标记
<div class='thread'>
<p>first
<p>second</p>
</p>
</div>
这里//div[@class=“thread”]/div
将仅返回第一个节点
如果我的假设不正确,请更正您可以尝试PARENT.getchildren()
>root=etree.fromstring(xml)
>>>root.xpath(“//div[@class='thread'])[0].getchildren()
[, ]
您能将HTML示例与当前和所需的输出一起共享吗?@Andersson:sample HTML addedseems好像这是一种解决方法。。。xpath是否以某种方式告诉我查找的元素必须是我调用xpath
函数的对象的子元素?这里的问题是:如果我在html中添加另一个
,其中包含
对象,那么它将无法正常工作,因为它会找到所有具有父对象的
,不是这个特定的
@Piotrek中的那些:这个XPath表达式只是这样做的:它选择属于某个父级的所有p
s。我只想添加反向方法:-)我用一个测试文件测试了两种方法,并且都得到了相同的结果。@Piotrek:如果您在问题中编辑了所需的结果,这会容易得多。是的,我得出了相同的结论。你是对的,这造成了一个问题。我不确定哪一个答案应该被标记为最佳,因为你的帖子解决了实际问题,但问题中描述的@zx485解决的问题是很好的观察。浏览器的同级-p
对示例的解释遵循HTML,允许省略p
结束标记(SGML结束标记省略错误),并且不希望嵌套p
元素(有效规则)。