Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么HTML节点的文本在HTMLPasser中为空?_Python_Html_Html Parsing_Html5lib - Fatal编程技术网

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中出现在同一位置。