在.Net中,我找到了这个伟大的库,HtmlAgilityPack,它允许您使用XPath轻松解析非格式良好的HTML。我在.Net网站上使用过这么多年,但我不得不为我的Python,Ruby和其他项目寻找更痛苦的库。有人知道其他语言的类似库吗?通过XPath解析HTML
回答
在蟒蛇,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>
看来这个问题可以更精确地表述为“如何将HTML转换为XML,以便XPath表达式可以对其进行评估”“。
这里有两个很好的工具:
TagSoup,一个开源项目,是一个Java和SAX - 基础的工具,由John Cowan开发。这是一个用Java编写的兼容SAX的解析器,它不是解析格式良好的或有效的XML,而是解析HTML,因为它在野外被发现:穷人,讨厌和野蛮,尽管通常很不简单。 TagSoup专为需要使用某种理性应用程序设计外观来处理这些东西的人设计。通过提供SAX接口,它允许将标准XML工具应用于最差的HTML。 TagSoup还包含一个命令行处理器,用于读取HTML文件,并可生成干净的HTML或与XHTML非常接近的格式良好的XML。
Taggle是TagSoup的商业C++端口。SgmlReader是由微软的Chris Lovett开发的工具。
SgmlReader是任何SGML文档(包括内置的HTML支持)的XmlReader API。还提供了一个命令行实用程序,用于输出格式良好的XML结果。
下载的压缩文件,包括独立的可执行文件和完整的源代码:SgmlReader.zip
的突出成就是the pure XSLT 2.0 Parser of HTML写David 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。
对于Ruby,我强烈推荐Jb Evain指出的Hpricot。如果你正在寻找一个更快的基于libxml的竞争对手,Nokogiri(见http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也不错(它支持像Hpricot这样的XPath和CSS搜索,但速度更快)。有一个基本的wiki和一些benchmarks。
我强烈推荐[引入nokogiri(HTTP://引入nokogiri。 org)这几天。这是Hpricot所做的一切以及更多。 – 2011-01-20 20:29:26
XML有一个免费的C实现,名为libxml2,它有一些XPath的api位,我已经使用了很大的成功,您可以指定HTML作为正在加载的文档。这对我来说有些不够完美的HTML文档。
对于大多数情况,当入站HTML被正确编码并且可以像“xml文档”一样读取时,XPath非常有用。您可能需要考虑使用特定于此目的的实用程序来清理HTML文档。以下是一个示例:http://tidy.sourceforge.net/
就这些XPath工具而言 - 您可能会发现大多数实现实际上都基于预先存在的C或C++库(如libxml2)。
我很惊讶没有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'
我得到的最稳定的结果是使用lxml.html的soupparser。你需要安装Python-LXML和python-beautifulsoup,那么你就可以做到以下几点:
- 1. 通过nokogiri和xpath解析图像
- 2. HTML通过PHP解析器
- 3. 通过HTML与PHP解析
- 4. 通过Java解析HTML-docs
- 5. 用xpath或cssSelector解析HTML?
- 6. node js xpath解析html表
- 7. 使用XPath/XMLHttpRequest解析HTML
- 8. 解析不带xpath的HTML
- 9. 通过HTML页面解析JSON数据
- 10. 通过ajax解析jQuery html(文本)
- 11. python3用xpath解析html部分
- 12. Dom和xpath查询为html解析
- 13. 使用HtmlAgilityPack-Xpath解析HTML文档,RegExp
- 14. 在Python中使用lxml解析HTML,xpath
- 15. 可能用xpath解析这个html吗?
- 16. PHP Xpath - 解析平坦的HTML结构
- 17. 使用JavaScript解析HTML使用Xpath
- 18. XPath通过解析HTML表格的特定文本来定位单元格
- 19. 如何使用html5lib解析HTML,并使用XPath查询解析的HTML?
- 20. 解析通过PHP
- 21. 解析通过PHP
- 22. 解析XPath查询
- 23. PHP xPath docx解析
- 24. Xpath和CSS解析
- 25. 解析通知不通过
- 26. 通过id解析XML解析
- 27. 通过HTML Treebuilder XPath提取链接
- 28. vba通过xpath引用html元素
- 29. 通过的XPath
- 30. 我是通过phantomjs解析一些HTML,如何设置我解析的语言?
您现在可能想要考虑Python的lxml – 2011-08-11 08:54:43
**危险!**对lxml使用BeautifulSoup解析器,因为elementtidy会对未声明的名称空间加以阻塞。我学会了艰难的道路! – 2012-02-25 04:37:58