首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用LXML解析破碎的HTML

如何用LXML解析破碎的HTML
EN

Stack Overflow用户
提问于 2013-10-01 22:01:08
回答 3查看 11.9K关注 0票数 25

我正在尝试使用Python2.5和2.7上的LXML解析器来解析损坏的HTML

与LXML文档(http://lxml.de/parsing.html#parsing-html)不同的是,解析损坏的超文本标记语言不起作用:

代码语言:javascript
复制
from lxml import etree
import StringIO
broken_html = "<html><head><title>test<body><h1>page title</h3>"
parser = etree.HTMLParser()
tree   = etree.parse(StringIO.StringIO(broken_html))

结果:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 2954, in lxml.etree.parse (src/lxml/lxml.etree.c:56220)
  File "parser.pxi", line 1550, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:82482)
  File "parser.pxi", line 1578, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82764)
  File "parser.pxi", line 1457, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:81562)
  File "parser.pxi", line 965, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:78232)
  File "parser.pxi", line 569, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:74488)
  File "parser.pxi", line 650, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:75379)
  File "parser.pxi", line 590, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:74712)
lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: h1 line 1 and h3, line 1, column 50
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-01 22:04:56

不要只是构造解析器,要使用它(根据您链接的示例):

代码语言:javascript
复制
>>> tree = etree.parse(StringIO.StringIO(broken_html), parser=parser)
>>> tree
<lxml.etree._ElementTree object at 0x2fd8e60>

或者使用lxml.html作为快捷方式:

代码语言:javascript
复制
>>> from lxml import html
>>> broken_html = "<html><head><title>test<body><h1>page title</h3>"
>>> html.fromstring(broken_html)
<Element html at 0x2dde650>
票数 27
EN

Stack Overflow用户

发布于 2014-11-07 11:18:05

lxml允许您通过使用recover=True创建解析器实例来加载损坏的xml

代码语言:javascript
复制
etree.HTMLParser(recover=True)

您可以在创建解析器时使用相同的技术。

票数 11
EN

Stack Overflow用户

发布于 2013-10-01 22:07:15

您可以尝试使用lxml.html

代码语言:javascript
复制
>>> import lxml.html
>>> broken_html = "<html><head><title>test<body><h1>page title</h3>"
>>> root = lxml.html.fromstring(broken_html)
>>> lxml.html.tostring(root)
'<html><head><title>test</title></head><body><h1>page title</h1></body></html>'
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19118238

复制
相关文章

相似问题

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