XPath:如何在每次换行后返回字符串

时间:2017-01-12 15:30:22

标签: python html xml xpath

我试图用python lxml的xpath方法解析HTML文件。说我有以下元素

<td class='some class'>
    <br>
    <br>
    <br>foo
    <br>
    <br>bar
</td>

我希望找到<br>标记之后的每个字符串,是否为空。也就是说,我期待xpath返回

['', '', 'foo', '', 'bar']

目前我的代码是

element.xpath('text()[preceding-sibling::br]')

只生成一个非空字符串列表

['foo', 'bar']

我有什么明显的遗漏吗?有谁可以请说明我如何才能使它发挥作用?

编辑:抱歉我的问题出了问题。每个标记后面都有无新行。所以我的问题实际上等于

from lxml.html import fromstring
s = '<td class="some class"><br><br><br>foo<br><br>bar</td>'
element = fromstring(s)
print(element.xpath('text()[preceding-sibling::br]'))

我要修改的最后一行,以便我的代码产生

['', '', 'foo', '', 'bar']

感谢。

3 个答案:

答案 0 :(得分:2)

F : 1
A : 2
B : 3
C : 4
D : 5
E : 1

出:

from lxml import etree

html = '''
<td class='some class'>
    <br>
    <br>
    <br>foo
    <br>
    <br>bar
</td>
'''
r = etree.HTML(html)
r.xpath('//td/text()')

这不是空白,它是换行符。

答案 1 :(得分:0)

'//td[@class="some class"]//text()[preceding-sibling::br]'

答案 2 :(得分:0)

对于空标记,在解析文档时不会创建text()节点,因此查询它们不会产生任何结果。

替代方法是选择所有br个节点并使用br.tail,其中包含紧跟节点后的文本内容或None的空标记,例如:

from lxml.html import fromstring
s = '<td class="some class"><br><br><br>foo<br><br>bar</td>'
element = fromstring(s)
print([e.tail or '' for e in element.xpath(".//br")])

这给出了预期的输出:

['', '', 'foo', '', 'bar']