解析html时为什么我需要item.text和item.text_content()其他人

PyN*_*bie 10 html python parsing lxml

还在学习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)
Run Code Online (Sandbox Code Playgroud)

所以在我运行之后,我看一下

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

unu*_*tbu 11

Accordng到的文档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>
Run Code Online (Sandbox Code Playgroud)

doc是的Element a.该a标签没有文本紧随其后(之间<a><b>左右.doc.textNone:

print(doc.text)
# None
Run Code Online (Sandbox Code Playgroud)

c标签后面有文字,所以doc.text_content()不是None:

print(doc.text_content())
# blah
Run Code Online (Sandbox Code Playgroud)

PS.还有的意义明确的说明text属性在这里.虽然它是文档的一部分,但lxml.etree.Element我认为texttail属性的含义同样适用于lxml.html.Element对象.

  • .text 或 .text_content() 返回文本字符串,如何获取 html 源代码而不是仅文本字符串? (2认同)

Ale*_*lli 5

您可能会混淆实现的不同且不兼容的接口lxml- 这些lxml.etree项目具有.text属性,而(例如)来自lxml.html的项目实现该text_content方法(以及来自BeautifulSoup 的项目,包含在 中lxml,具有.string属性......有时[[仅具有单个子节点的节点,该子节点是一个字符串...]])。

是的,选择既实现自己的接口又模拟或包含其他库本质上令人困惑的,但它可以很方便......;-)。lxml