当前位置: 首页 > 知识库问答 >
问题:

如何使用 LXML 解析损坏的 HTML

方宜
2023-03-14

我正在尝试在python 2.5和2.7上使用LXML解析器解析损坏的HTML

与 LXML 文档 (http://lxml.de/parsing.html#parsing-html) 不同,解析损坏的 HTML 不起作用:

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))

结果:

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

共有3个答案

钱远
2023-03-14

您可以尝试使用 lxml.html

>>> 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>'
云瑞
2023-03-14

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

etree.HTMLParser(recover=True)

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

苏承载
2023-03-14

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

>>> tree = etree.parse(StringIO.StringIO(broken_html), parser=parser)
>>> tree
<lxml.etree._ElementTree object at 0x2fd8e60>

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

>>> from lxml import html
>>> broken_html = "<html><head><title>test<body><h1>page title</h3>"
>>> html.fromstring(broken_html)
<Element html at 0x2dde650>
 类似资料:
  • 问题内容: 我试图以一种内存高效的方式(例如从磁盘延迟流式传输而不是将整个文件加载到内存中)来使用lxml解析巨大的xml文件。不幸的是,文件包含一些坏的ascii字符,破坏了默认的解析器。如果我设置了restore = True,则解析器可以工作,但是iterparse方法不使用restore参数或自定义解析器对象。有谁知道如何使用iterparse解析损坏的xml? 谢谢你的帮助! 编辑-这是

  • 昨天我使用Xampp创建了一些简单的基于Web的实用工具。今天我想继续工作,但xampp控制面板给了我一些错误。 这是MySQL错误日志: 已经尝试过修复,但mySQL服务甚至无法启动,所以我有点无助。。。

  • 我正在尝试创建一个zip文件,以便能够通过http发送多个文件。 我的问题是,生成的Zip文件在发送之前和之后都“损坏”。问题是我无法找到我做错了什么,因为我在控制台中没有收到任何错误。 那么,有人有一个想法文件我生成的zip文件损坏? 这是我的代码: 谢谢你的帮助!

  • 问题内容: 当我尝试使用npm时,我刚刚安装了node ,但始终收到以下错误: 我尝试这样做,但是它无法更新自身,只是不断在上面抛出相同的错误。 当我运行它时,似乎是最新版本。 我尝试删除该文件夹并在node.js安装程序上运行修复功能,但未替换该模块。 问题答案: 删除全局NPM文件夹 https://stackoverflow.com/a/5926706/349659 对于Windows,这很

  • 问题内容: 我试图最终解决一些编码问题,这些问题从尝试使用lxml抓取HTML弹出。这是我遇到的三个示例HTML文档: 1。 2。 3。 我的基本脚本: 结果是: 因此,显然是样本1和缺少标签的问题。这里的解决方案将正确地将示例1识别为utf-8,因此在功能上与我的原始代码等效。 lxml文档出现冲突: 从这里开始,该示例似乎建议我们应该使用UnicodeDammit将标记编码为unicode。

  • 我试图从一个网站下载所有pdf文件,但创建的每个pdf都已损坏。。。

  • 我编写的下载文件的方法总是产生损坏的文件。 我通过adb访问这些文件,将它们传输到我的sccard,在那里我看到它们似乎有合适的大小,但没有根据例如Linux命令的类型。 你知道丢失了什么以及如何修复它吗? 谢谢。 代码的简单版本(但错误相同) 日志:< code > file . length:2485394 | content length:1399242 问题是,我从我的API单例中获得了,

  • 本文向大家介绍Python中的html5lib和lxml解析器,包括了Python中的html5lib和lxml解析器的使用技巧和注意事项,需要的朋友参考一下 html5lib是用于解析HTML的纯Python库。它被设计为符合WHATWG HTML规范,所有主要的Web浏览器都实现了该规范。它可以解析HTML文档的几乎所有元素,将其分解为不同的标记和片段,可以针对各种用例将其过滤掉。它以与主要浏