Разбор HTML с помощью lxml - как сохранить пустой контент в результирующем списке?

Я использую lxml для анализа html-файла:

from lxml import html

tree = html.parse(myfile)
data = tree.xpath('//p/text()')

У меня 300 тегов <p>text</p> в моем html-файле, но len(data) всего 250, потому что иногда в моем html есть <p></p>. Я хочу, чтобы они были включены в data как 'nan' или ''.

Любые предложения о том, как это сделать?


person user1566200    schedule 05.02.2016    source источник


Ответы (1)


//p/text() найдет только тексты p элементов с непустым текстом.

Вместо этого найдите все элементы p и вызовите .text_content() для каждого из них:

data = [p.text_content() for p in tree.xpath('//p')]

Чтобы продемонстрировать разницу:

>>> from lxml import html
>>> 
>>> 
>>> data = """
... <p>text1</p>
... <p></p>
... <p>text2</p>
... """
>>> 
>>> tree = html.fromstring(data)
>>> data = tree.xpath('//p/text()')
>>> len(data)
2
>>> 
>>> data = [p.text_content() for p in tree.xpath('//p')]
>>> len(data)
3
person alecxe    schedule 05.02.2016