首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自.itertext()的lxml错误"ValueError: Input没有元素: HtmlComment“

来自.itertext()的lxml错误"ValueError: Input没有元素: HtmlComment“
EN

Stack Overflow用户
提问于 2015-06-25 20:06:07
回答 1查看 1.4K关注 0票数 5

我试图使用elt.itertext() (v3.5.0b1)遍历子树的文本内容,如下所示:

代码语言:javascript
运行
复制
import lxml.html.soupparser as soupparser
import requests

doc = requests.get("http://f10.5post.com/forums/showthread.php?t=1142017").content
tree = soupparser.fromstring(doc)

nodes = tree.getchildren()

for elt in nodes:
    for t in elt.itertext():
         print t

但我一直说错了

代码语言:javascript
运行
复制
 File "src/lxml/iterparse.pxi", line 248, in lxml.etree.iterwalk.__init__ (src/lxml/lxml.etree.c:134032)
 File "src/lxml/apihelpers.pxi", line 67, in lxml.etree._rootNodeOrRaise (src/lxml/lxml.etree.c:15220)
ValueError: Input object has no element: HtmlComment

有办法跳过所有HTML注释吗?而且,这个错误实际上意味着什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-08-20 05:12:51

这很正常。

代码语言:javascript
运行
复制
>>> from lxml import etree
>>> doc = '''
... <html><!-- PAGENAV POPUP -->
...     <div class="vbmenu_popup" id="pagenav_menu" style="display:none">
...             <table cellpadding="4" cellspacing="1" border="0">
...             <tr>
...                     <td class="thead" nowrap="nowrap">Go to Page...</td>
...             </tr>
...             <tr>
...                     <td class="vbmenu_option" title="nohilite">
...                     <form action="index.php" method="get" onsubmit="return this.gotopage()" id="pagenav_form">
...                             <input type="text" class="bginput" id="pagenav_itxt" style="font-size:11px" size="4" />
...                             <input type="button" class="button" id="pagenav_ibtn" value="Go" />
...                     </form>
...                     </td>
...             </tr>
...             </table>
...     </div>
... <!-- / PAGENAV POPUP -->
... </html>'''
>>> root = etree.fromstring(doc)
>>> nodes = root.getchildren()
>>> nodes
[<!-- PAGENAV POPUP -->, <Element div at 0x10367f290>, <!-- / PAGENAV POPUP -->]
>>> for elt in nodes:
...     for t in elt.itertext():
...         print t
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "lxml.etree.pyx", line 1406, in lxml.etree._Element.itertext (src/lxml/lxml.etree.c:48845)
  File "lxml.etree.pyx", line 2763, in lxml.etree.ElementTextIterator.__cinit__ (src/lxml/lxml.etree.c:64747)
  File "iterparse.pxi", line 219, in lxml.etree.iterwalk.__init__ (src/lxml/lxml.etree.c:125303)
  File "apihelpers.pxi", line 72, in lxml.etree._rootNodeOrRaise (src/lxml/lxml.etree.c:13689)
ValueError: Input object has no element: lxml.etree._Comment

正如你在上面看到的

代码语言:javascript
运行
复制
>>> nodes
[<!-- PAGENAV POPUP -->, <Element div at 0x10367f290>, <!-- / PAGENAV POPUP -->]

注意事项:不推荐getchildren。你可以用列表。

代码语言:javascript
运行
复制
>>> list(root)
[<!-- PAGENAV POPUP -->, <Element div at 0x10367f290>, <!-- / PAGENAV POPUP -->]

节点是元素注释的列表。如果您检查itertext()是如何工作的:

创建文本迭代器。迭代器按文档顺序在上循环此元素和所有子元素,并返回所有内部文本。

另一方面,如果我不是在列表上迭代,而是直接在根元素上迭代:

代码语言:javascript
运行
复制
>>> for t in root.itertext():
...     print t
... 

我得到了所有的文字和很多空格。:)

如果您仍然想在节点列表上迭代。你可以用

代码语言:javascript
运行
复制
>>> [item.tag for item in nodes]
[<built-in function Comment>, 'div', <built-in function Comment>]

你也可以

代码语言:javascript
运行
复制
>>> [item.__class__ for item in nodes]
[<type 'lxml.etree._Comment'>, <type 'lxml.etree._Element'>, <type 'lxml.etree._Comment'>]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31059786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档