【发布时间】:2010-09-22 02:35:57
【问题描述】:
在 .Net 中,我发现了这个很棒的库 HtmlAgilityPack,它允许您使用 XPath 轻松解析格式不正确的 HTML。我已经在我的 .Net 站点中使用了几年,但我不得不为我的 Python、Ruby 和其他项目使用更痛苦的库。有人知道其他语言的类似库吗?
【问题讨论】:
标签: python html ruby xpath parsing
在 .Net 中,我发现了这个很棒的库 HtmlAgilityPack,它允许您使用 XPath 轻松解析格式不正确的 HTML。我已经在我的 .Net 站点中使用了几年,但我不得不为我的 Python、Ruby 和其他项目使用更痛苦的库。有人知道其他语言的类似库吗?
【问题讨论】:
标签: python html ruby xpath parsing
我很惊讶没有提到 lxml。它速度极快,可以在任何允许 CPython 库的环境中工作。
这是you can parse HTML via XPATH using lxml的方法。
>>> from lxml import etree
>>> doc = '<foo><bar></bar></foo>'
>>> tree = etree.HTML(doc)
>>> r = tree.xpath('/foo/bar')
>>> len(r)
1
>>> r[0].tag
'bar'
>>> r = tree.xpath('bar')
>>> r[0].tag
'bar'
【讨论】:
在 python 中,ElementTidy 解析标签汤并生成一个元素树,它允许使用 XPath 进行查询:
>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
【讨论】:
我使用过的最稳定的结果是使用 lxml.html 的汤解析器。您需要安装python-lxml和python-beautifulsoup,然后您可以执行以下操作:
from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
【讨论】:
BeautifulSoup 是一个很好的 Python 库,用于以简洁的方式处理混乱的 HTML。
【讨论】:
似乎这个问题可以更准确地表述为“如何将 HTML 转换为 XML,以便可以针对它评估 XPath 表达式”。
这里有两个很好的工具:
TagSoup是一个开源程序,是一个基于Java和SAX的工具,由John Cowan开发。这是
一个用 Java 编写的符合 SAX 的解析器,它不是解析格式良好或有效的 XML,而是解析在野外发现的 HTML:糟糕、肮脏和野蛮,尽管通常很不短。 TagSoup 是为那些必须使用某种看似合理的应用程序设计来处理这些东西的人设计的。通过提供 SAX 接口,它允许将标准 XML 工具应用于甚至最糟糕的 HTML。 TagSoup 还包括一个命令行处理器,它读取 HTML 文件并可以生成干净的 HTML 或格式良好的 XML,它与 XHTML 非常接近。
Taggle 是 TagSoup 的商业 C++ 端口。
SgmlReader是微软Chris Lovett开发的工具。
SgmlReader 是任何 SGML 文档(包括对 HTML 的内置支持)的 XmlReader API。还提供了一个命令行实用程序,用于输出格式正确的 XML 结果。
下载包含独立可执行文件和完整源代码的 zip 文件:SgmlReader.zip
【讨论】:
对于 Ruby,我强烈推荐 Jb Evain 指出的 Hpricot。如果您正在寻找更快的基于 libxml 的竞争对手,Nokogiri(请参阅http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也非常好(它支持 XPath 和 CSS 搜索,如 Hpricot,但速度更快)。有一个基本的wiki 和一些benchmarks。
【讨论】:
有一个用于 XML 的免费 C 实现,称为 libxml2,它有一些用于 XPath 的 api 位,我已经非常成功地使用了这些位,您可以将 HTML 指定为正在加载的文档。对于一些不太完美的 HTML 文档,这对我有用..
在大多数情况下,当入站 HTML 编码正确并且可以“像 xml 文档”一样阅读时,XPath 最有用。您可能需要考虑使用专门用于此目的的实用程序来清理 HTML 文档。这是一个例子:http://tidy.sourceforge.net/
就这些 XPath 工具而言,您可能会发现大多数实现实际上都是基于预先存在的 C 或 C++ 库,例如 libxml2。
【讨论】: