2008-11-13 86 views
23

在.Net中,我找到了这个伟大的库,HtmlAgilityPack,它允许您使用XPath轻松解析非格式良好的HTML。我在.Net网站上使用过这么多年,但我不得不为我的Python,Ruby和其他项目寻找更痛苦的库。有人知道其他语言的类似库吗?通过XPath解析HTML

回答

6

在蟒蛇,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> 
+1

您现在可能想要考虑Python的lxml – 2011-08-11 08:54:43

+8

**危险!**对lxml使用BeautifulSoup解析器,因为elementtidy会对未声明的名称空间加以阻塞。我学会了艰难的道路! – 2012-02-25 04:37:58

5

BeautifulSoup是一个很好的Python库,用于处理凌乱的HTML。

+13

BeautifulSoup不使用XPath :) – dzen 2011-05-12 15:56:13

3

看来这个问题可以更精确地表述为“如何将HTML转换为XML,以便XPath表达式可以对其进行评估”“。

这里有两个很好的工具:

  1. TagSoup,一个开源项目,是一个Java和SAX - 基础的工具,由John Cowan开发。这是一个用Java编写的兼容SAX的解析器,它不是解析格式良好的或有效的XML,而是解析HTML,因为它在野外被发现:穷人,讨厌和野蛮,尽管通常很不简单。 TagSoup专为需要使用某种理性应用程序设计外观来处理这些东西的人设计。通过提供SAX接口,它允许将标准XML工具应用于最差的HTML。 TagSoup还包含一个命令行处理器,用于读取HTML文件,并可生成干净的HTML或与XHTML非常接近的格式良好的XML。
    Taggle是TagSoup的商业C++端口。

  2. SgmlReader是由微软的Chris Lovett开发的工具。
    SgmlReader是任何SGML文档(包括内置的HTML支持)的XmlReader API。还提供了一个命令行实用程序,用于输出格式良好的XML结果。
    下载的压缩文件,包括独立的可执行文件和完整的源代码:SgmlReader.zip

1

的突出成就是the pure XSLT 2.0 Parser of HTMLDavid Carlisle

阅读它的代码对我们每个人来说都是一个很好的学习练习。

从描述:

d:htmlparse(字符串)
  d:htmlparse(字符串,命名空间,HTML模式)

   的一个参数的形式是等同于)
    d:htmlparse(字符串, 'http://ww.w3.org/1999/xhtml',真()))

   解析使用一些内置启发式)字符串作为HTML和/或XML    控制隐含的元素打开和关闭。

   它不具有HTML DTD的全部知识,但确实有
   空元素和实体定义完整列表的完整列表。HTML实体和
   十进制和十六进制字符引用都被接受。注意html-entities
   即使在html-mode = false()的情况下也被识别。

   元素名称小写(如果HTML模式是真实的()),并放入该命名空间参数(其可以是“”指定的
   命名空间来表示
   无命名空间,除非输入已显式命名空间声明,在
   这些将被兑现这种情况下。

   属性名小写如果HTML模式=真()

阅读更详细的描述here

希望这有助于。

干杯,

Dimitre Novatchev。

2

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

+1

我强烈推荐[引入nokogiri(HTTP://引入nokogiri。 org)这几天。这是Hpricot所做的一切以及更多。 – 2011-01-20 20:29:26

1

XML有一个免费的C实现,名为libxml2,它有一些XPath的api位,我已经使用了很大的成功,您可以指定HTML作为正在加载的文档。这对我来说有些不够完美的HTML文档。

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

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

41

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

我得到的最稳定的结果是使用lxml.html的soupparser。你需要安装Python-LXML和python-beautifulsoup,那么你就可以做到以下几点: