我试图用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']
感谢。
答案 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']