如何在python中使用标准库解析格式错误的HTML

2024-04-20 07:01:43 发布

您现在位置:Python中文网/ 问答频道 /正文

有太多的html and xml libraries built into python,很难相信没有对实际HTML解析的支持。

我已经为这个任务找到了很多优秀的第三方库,但是这个问题是关于python标准库的。

要求:

  • 仅使用Python标准库组件(任何2.x版本)
  • DOM支持
  • 处理HTML实体( 
  • 处理部分文档(例如:Hello, <i>World</i>!

加分:

  • XPATH支持
  • 处理未关闭/格式错误的标记。(<big>does anyone here know <html ???

这是我要求的90%的解决方案。这适用于我尝试过的有限的HTML集合,但是正如每个人都清楚地看到的那样,这并不完全是健壮的。因为我盯着文档看了15分钟和一行代码,所以我想我可以向stackoverflow社区咨询类似但更好的解决方案。。。

from xml.etree.ElementTree import fromstring
DOM = fromstring("<html>%s</html>" % html.replace('&nbsp;', '&#160;'))

Tags: and文档版本libraries标准html组件xml
3条回答

把美丽组的源代码复制到你的脚本中;-)我只是在开玩笑。。。你所能写的任何能完成这项工作的东西,或多或少都会复制类似库中已经存在的功能。

如果这真的不起作用,我不得不问,为什么只使用标准库组件如此重要?

可靠地解析HTML是一个相对现代的开发(尽管看起来很奇怪)。因此,标准库中肯定没有任何内容。HTMLParser可能看起来是一种处理HTML的方法,但事实并非如此——它在许多非常常见的HTML上都失败了,尽管您可以处理这些失败,但总会有另一个您没有想到的情况(如果您真的成功地处理了每一个失败,您将基本上重新创建BeautifulSoup)。

真正合理的解析HTML的方法只有3种(在web上可以找到):lxml.htmlBeautifulSouphtml5lib。到目前为止,lxml是速度最快的,但安装起来可能有点棘手(在App Engine这样的环境中是不可能的)。html5lib是基于HTML 5如何指定解析的;尽管在实践中与其他两个类似,但它解析断开的HTML的方式可能更“正确”(它们都解析非常好的HTML相同)。它们都在解析损坏的HTML方面做了相当出色的工作。虽然我发现它的API不必要地古怪,但BeautifulSoup可能很方便。

您的选择是更改您的需求,或者复制第三方模块开发人员所做的所有工作。

漂亮的soup由一个包含2000行代码的python文件组成,如果依赖性太大,那么继续写你自己的,它不会很好地工作,而且可能不会小很多。

相关问题 更多 >