Python 为什么HTML节点的文本在HTMLPasser中为空?
在下面的示例中,我希望得到Python 为什么HTML节点的文本在HTMLPasser中为空?,python,html,html-parsing,html5lib,Python,Html,Html Parsing,Html5lib,在下面的示例中,我希望得到文本的Foo: from io import StringIO from html5lib import HTMLParser fp = StringIO(''' <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h2> <span class="section-number">
文本的Foo
:
from io import StringIO
from html5lib import HTMLParser
fp = StringIO('''
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>
<span class="section-number">1. </span>
Foo
<a class="headerlink" href="#foo">¶</a>
</h2>
</body>
</html>
''')
etree = HTMLParser(namespaceHTMLElements=False).parse(fp)
h2 = etree.findall('.//h2')[0]
h2.text
那么
Foo
在哪里?我认为你在树上的位置太浅了。试试这个:
from io import StringIO
from html5lib import HTMLParser
fp = StringIO('''
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>
<span class="section-number">1. </span>
Foo
<a class="headerlink" href="#foo">¶</a>
</h2>
</body>
</html>
''')
etree = HTMLParser(namespaceHTMLElements=False).parse(fp)
etree.findall('.//h2')[0][0].tail
我认为你在树上的位置太浅了一层。试试这个:
from io import StringIO
from html5lib import HTMLParser
fp = StringIO('''
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>
<span class="section-number">1. </span>
Foo
<a class="headerlink" href="#foo">¶</a>
</h2>
</body>
</html>
''')
etree = HTMLParser(namespaceHTMLElements=False).parse(fp)
etree.findall('.//h2')[0][0].tail
使用lxml:
fp2 = '''
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>
<span class="section-number">1. </span>
Foo
<a class="headerlink" href="#foo">¶</a>
</h2>
</body>
</html>
'''
import lxml.html
tree = lxml.html.fromstring(fp2)
for item in tree.xpath('//h2'):
target = item.text_content().strip()
print(target.split('\n')[1].strip())
fp2=''
1.
福
'''
导入lxml.html
tree=lxml.html.fromstring(fp2)
对于tree.xpath(“//h2”)中的项:
target=item.text_content().strip()
打印(target.split('\n')[1].strip())
输出:
福
使用lxml:
fp2 = '''
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h2>
<span class="section-number">1. </span>
Foo
<a class="headerlink" href="#foo">¶</a>
</h2>
</body>
</html>
'''
import lxml.html
tree = lxml.html.fromstring(fp2)
for item in tree.xpath('//h2'):
target = item.text_content().strip()
print(target.split('\n')[1].strip())
fp2=''
1.
福
'''
导入lxml.html
tree=lxml.html.fromstring(fp2)
对于tree.xpath(“//h2”)中的项:
target=item.text_content().strip()
打印(target.split('\n')[1].strip())
输出:
福
当h2不包含文本时,为什么要使用“Foo”呢。另一方面,子元素span是。@blueriens
在Foo
之前关闭,因此Foo
不在
中。@blueriens我编辑了我的问题,在span
中找不到Foo
。是的,我已经查过手册了。为什么h2不包含文本,而你却期望“Foo”呢。另一方面,子元素span是。@blueriens
在Foo
之前关闭,因此Foo
不在
中。@blueriens我编辑了我的问题,在span
中找不到Foo
。是的,我查过手册了。好的,我明白,但我不明白…:)它似乎是Foo
的一部分span.tail
,尽管它位于span
@nowox之外-它看起来确实像是一个解析错误。如果你用lxml解析html,你会在h2
文本中找到Foo
,这是应该的。@JackFleeting你的意思是HTMLParser
有缺陷吗?@nowox-很可能是这样,尽管我对它的了解还不够明确。我可以说lxml的默认解析器工作正常。@Novox我认为您误解了ElementTree
如何表示数据:el.text
是元素的子元素,如果它是文本节点el.tail
是元素的以下同级元素(如果它是文本节点)。另请参见,例如,和。好的,我明白,但我不明白…:)它似乎是Foo
的一部分span.tail
,尽管它位于span
@nowox之外-它看起来确实像是一个解析错误。如果你用lxml解析html,你会在h2
文本中找到Foo
,这是应该的。@JackFleeting你的意思是HTMLParser
有缺陷吗?@nowox-很可能是这样,尽管我对它的了解还不够明确。我可以说lxml的默认解析器工作正常。@Novox我认为您误解了ElementTree
如何表示数据:el.text
是元素的子元素,如果它是文本节点el.tail
是元素的以下同级元素(如果它是文本节点)。另请参见,例如和。谢谢:)因此我当时没有使用相同的库(来自lxml import etree
)@nowox-no;它们听起来是一样的:)注意这里产生的树lxml
与产生的树html5lib
没有区别;“foo”变成了项。children[0]。tail
在上面的代码中,所以这并不能回答为什么它不在项中。text
@gsnedders-我不知道你在说什么;OP询问的是一个lxml
解决方案,而不是您认为问题的答案。OP询问为什么它不在h2.text
(您没有回答)和“Foo在哪里?”(好吧,您可以从h2.text\u content()
,但它出现在所有文本节点后代的总和中并不奇怪)。您在评论中声称这是html5lib的解析错误,尽管它在lxml中出现在同一个位置。谢谢:)所以我当时没有使用同一个库(来自lxml导入etree
)@nowox-no;它们听起来是一样的:)注意这里产生的树lxml
与产生的树html5lib
没有区别;“foo”变成了项。children[0]。tail
在上面的代码中,所以这并不能回答为什么它不在项中。text
@gsnedders-我不知道你在说什么;OP询问的是一个lxml
解决方案,而不是您认为问题的答案。OP询问为什么它不在h2.text
(您没有回答)和“Foo在哪里?”(好吧,您可以从h2.text\u content()
,但它出现在所有文本节点后代的总和中并不奇怪)。您在评论中声称这是html5lib的解析错误,尽管它在lxml中出现在同一位置。