При разборе html зачем мне иногда нужно item.text и item.text_content () другие - PullRequest
9 голосов
/ 19 августа 2010

Все еще изучаю lxml. Я обнаружил, что иногда я не могу получить текст элемента из дерева, используя item.text. Если я использую item.text_content (), я в порядке. Я не уверен, что я понимаю, почему еще. Любые советы будут оценены

Хорошо, я не уверен, как именно привести пример, не заставляя вас обращаться с файлом:

вот код, который я написал, чтобы понять, почему я не получил ожидаемый текст:

theTree=html.fromstring(open(notmatched[0]).read()) 
text=[]
text_content=[]
notText=[]
hasText=[]
for each in theTree.iter():
    if each.text:
        text.append(each.text)
        hasText.append(each)   # list of elements that has text each.text is true
    text_content.append(each.text_content()) #the text for all elements 
    if each not in hasText:
        notText.append(each)

Итак, после этого я смотрю на

>>> len(notText)
3612
>>> notText[40]
<Element b at 26ab650>
>>> notText[40].text_content()
'(I.R.S. Employer'
>>> notText[40].text

Ответы [ 2 ]

11 голосов
/ 19 августа 2010

Согласно Документам text_content метод:

Возвращает текстовое содержимое элемента, включая текстовое содержимое его дети, без разметки.

Так, например,

import lxml.html as lh
data = """<a><b><c>blah</c></b></a>"""
doc = lh.fromstring(data)
print(doc)
# <Element a at b76eb83c>

doc является Element a. Тег a не имеет текста, следующего сразу за ним (между <a> и <b>. Поэтому doc.text равен None:

print(doc.text)
# None

но после тега c есть текст, поэтому doc.text_content() не None:

print(doc.text_content())
# blah

PS. Здесь есть четкое описание значения атрибута text здесь . Хотя это часть документов для lxml.etree.Element, я думаю, что значение атрибутов text и tail одинаково хорошо применимо к lxml.html.Element объектам.

3 голосов
/ 19 августа 2010

Возможно, вы путаете разные и несовместимые интерфейсы, которые реализует lxml - элементы lxml.etree имеют атрибут .text, в то время как (например) элементы из lxml.html реализуют text_contentmethod (и из BeautifulSoup , , а также , включенные в lxml, имеют атрибут .string ... иногда [[только узлы с одним дочерним элементомкоторая является строкой ...]]).

Да, это по своей сути сбивает с толку, что lxml выбирает оба варианта для реализации своих собственных интерфейсов и , эмулирующих или включающихдругие библиотеки, но это может быть удобно ...; -).

...