使用lxml` .xpath()`和`for`的意外输出

时间:2016-06-05 04:34:27

标签: python xpath lxml

我有以下文字

testing = """
<div>
<a>11</a>
</div>
<div>
<a>21</a>
<a>23</a>
</div>
"""

我想提取<a></a>内的文字。以下是我的尝试,

testing = html.fromstring(testing)
testing = testing.xpath("//div")
[x.xpath("//a/text()") for x in testing]

输出

[['11', '21', '23'], ['11', '21', '23'], ['11', '21', '23']]

但我期望和想要的是

[['11'], ['21', '23']]

我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:4)

testing.xpath("//div")返回匹配div个节点的列表。对于每个div节点,您要求查找所有a个元素,但表达式开头的//将从文档树的根开始搜索。您需要通过添加一个点来进行特定于列表中每个div的搜索:

[x.xpath(".//a/text()") for x in testing]
    # HERE^

或者,如果适用于您的情况,您可以在一个表达式中一次性完成:

x.xpath("//div/a/text()")