将xpath表达式传递给xpath结果

时间:2018-08-28 11:16:22

标签: python html xpath lxml

我正在努力了解python的lxml库的一部分。

获取以下html文件,即 sample.html

<div class="team">
    <ul class="team-members">
        <li class="team-member">
                <span class="team-member-name">John Doe</span>
                <span class="team-member-age">30</span>
            </li>
        <li class="team-member">
                <span class="team-member-name">Jane Doe</span>
                <span class="team-member-age">32</span>
            </li>
        </ul>
    </div>
<div class="team">
    <ul class="team-members">
        <li class="team-member">
                <span class="team-member-name">Joe Smith</span>
                <span class="team-member-age">28</span>
            </li>
        <li class="team-member">
                <span class="team-member-name">Jill Smith</span>
                <span class="team-member-age">41</span>
            </li>
        </ul>
    </div>

我可以将此html导入lxml树:

from lxml import html

file = open("sample.html",'r')
sample = file.read()

tree = html.fromstring(sample)

然后,我可以使用xpath来获取html中所有文本原子的列表,如下所示:

tree.xpath('//text()')

当我通过如下所示的xpath时出现问题:

elements = tree.xpath("//li")

打印元素产量

[<Element li at 0x48be638>,
 <Element li at 0x48be9f8>,
 <Element li at 0x48beb88>,
 <Element li at 0x48bec78>]

我可以将xpath传递给每个,但是每个的行为就像原始树一样!例如,

elements[0].xpath('//text()')

似乎返回与上面完全相同的列表。但是,

elements[0].tag

返回“ li”,因此每个元素似乎都有一些有关其来源的记录。

问题:理想情况下,我希望能够分别访问html文档中的每个列表成员,并将xpath传递给每个成员。这样有可能吗?每个“元素li”实际上包含什么信息?

1 个答案:

答案 0 :(得分:2)

elements[0].xpath('//text()')在给定的HTML DOM中返回所有个文本节点。要获取elements[0]的后代文本节点,您需要以点(context node)开始XPath:

elements[0].xpath('.//text()')