Điều này là bình thường.
>>> 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
Như bạn thấy ở trên
>>> nodes
[<!-- PAGENAV POPUP -->, <Element div at 0x10367f290>, <!--/PAGENAV POPUP -->]
Note: getChildren bị phản đối. Bạn có thể sử dụng danh sách.
>>> list(root)
[<!-- PAGENAV POPUP -->, <Element div at 0x10367f290>, <!--/PAGENAV POPUP -->]
Các nút là danh sách các yếu tố và. Nếu bạn kiểm tra như thế nào itertext() đang làm việc:
Creates a text iterator. The iterator loops over this element and all subelements, in document order, and returns all inner text.
Mặt khác nếu thay vì lặp lại trong danh sách, tôi đã lặp lại trực tiếp trên phần tử gốc với:
>>> for t in root.itertext():
... print t
...
tôi nhận được tất cả các văn bản và rất nhiều không gian. :)
nếu bạn vẫn muốn lặp lại trên danh sách các nút. Bạn có thể suy ra thiên nhiên với
>>> [item.tag for item in nodes]
[<built-in function Comment>, 'div', <built-in function Comment>]
Bạn cũng có thể làm
>>> [item.__class__ for item in nodes]
[<type 'lxml.etree._Comment'>, <type 'lxml.etree._Element'>, <type 'lxml.etree._Comment'>]
Không chắc nếu có bất kỳ cách built-in để làm điều đó trừ khi bạn sử dụng một @AndyG PullParser – AndyG
Tôi tự hỏi tại sao lxml chuyến đi qua trong trường hợp cụ thể này. Hy vọng rằng tôi sẽ không cần phải bỏ qua các bình luận HTML để tránh lỗi này. – Kar
Tôi chưa sử dụng thư viện đó, nhưng tôi nghĩ bạn có thể thực hiện những gì bạn cần một cách dễ dàng với [BeautifulSoup] (https://pypi.python.org/pypi/beautifulsoup4) – rll