通过 XPath 解析 HTML [关闭]

Posted

技术标签:

【中文标题】通过 XPath 解析 HTML [关闭]【英文标题】:Parse HTML via XPath [closed] 【发布时间】:2010-09-22 02:35:57 【问题描述】:

在 .Net 中,我发现了这个很棒的库 htmlAgilityPack,它允许您使用 XPath 轻松解析格式不正确的 HTML。我已经在我的 .Net 站点中使用了几年,但我不得不为我的 Python、Ruby 和其他项目使用更痛苦的库。有人知道其他语言的类似库吗?

【问题讨论】:

【参考方案1】:

我很惊讶没有提到 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'

【讨论】:

【参考方案2】:

在 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/xhtmlp")
<Element http://www.w3.org/1999/xhtmlp at 264eb8>

【讨论】:

你现在可以考虑为 Python 使用 lxml 危险! 使用 BeautifulSoup 解析器来代替 lxml,因为 elementtidy 会阻塞未声明的命名空间。我学得很辛苦!【参考方案3】:

我使用过的最稳定的结果是使用 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]")

【讨论】:

【参考方案4】:

BeautifulSoup 是一个很好的 Python 库,用于以简洁的方式处理混乱的 HTML。

【讨论】:

BeautifulSoup 不使用 xpath :)【参考方案5】:

似乎这个问题可以更准确地表述为“如何将 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

【讨论】:

【参考方案6】:

对于 Ruby,我强烈推荐 Jb Evain 指出的 Hpricot。如果您正在寻找更快的基于 libxml 的竞争对手,Nokogiri(请参阅http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也非常好(它支持 XPath 和 CSS 搜索,如 Hpricot,但速度更快)。有一个基本的wiki 和一些benchmarks。

【讨论】:

这些天我强烈推荐Nokogiri。这是 Hpricot 的一切,甚至更多。【参考方案7】:

有一个用于 XML 的免费 C 实现,称为 libxml2,它有一些用于 XPath 的 api 位,我已经非常成功地使用了这些位,您可以将 HTML 指定为正在加载的文档。对于一些不太完美的 HTML 文档,这对我有用..

在大多数情况下,当入站 HTML 编码正确并且可以“像 xml 文档”一样阅读时,XPath 最有用。您可能需要考虑使用专门用于此目的的实用程序来清理 HTML 文档。这是一个例子:http://tidy.sourceforge.net/

就这些 XPath 工具而言,您可能会发现大多数实现实际上都是基于预先存在的 C 或 C++ 库,例如 libxml2。

【讨论】:

以上是关于通过 XPath 解析 HTML [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中解析 html 的最佳方法是啥? [关闭]

Xpath Helper的使用

为什么XPath不能在IE中运行? [关闭]

DOM 与 XPath - 区别? [关闭]

Python 通过lxml 解析html页面自动组合xpath实例

使用 HTML 解析器获取特定 div 的内容 [关闭]