Я пытаюсь проанализировать HTML-файл с помощью метода xpath в Python lxml. Скажем, у меня есть следующий элемент

<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
Yujun Qin 12 Янв 2017 в 18:30

3 ответа

Лучший ответ

Для пустых тегов при синтаксическом анализе документа узел 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']
0
mata 12 Янв 2017 в 16:24
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()')

Вне:

['\n    ', '\n    ', '\n    ', 'foo\n    ', '\n    ', 'bar\n']

Это не пробел, это перевод строки.

2
宏杰李 12 Янв 2017 в 15:42
'//td[@class="some class"]//text()[preceding-sibling::br]'
0
eLRuLL 12 Янв 2017 в 15:38