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
元素(有效规则)。