在.Net中,我找到了这个很棒的库HtmlAgilityPack,它允许您使用XPath轻松解析非格式良好的HTML。我已经在我的.Net站点中使用了这几年,但是我不得不为我的Python,Ruby和其他项目解决更多痛苦的库。是否有人知道其他语言的类似库?
答案 0 :(得分:51)
我很惊讶没有一次提到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'
答案 1 :(得分:6)
在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>
答案 2 :(得分:5)
BeautifulSoup是一个很好的Python库,用于以干净的方式处理凌乱的HTML。
答案 3 :(得分:5)
我用过的最稳定的结果是使用lxml.html的soupparser。您需要安装python-lxml和python-beautifulsoup,然后您可以执行以下操作:
from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
答案 4 :(得分:3)
似乎可以更准确地说明这个问题是“如何将HTML转换为XML,以便可以针对它评估XPath表达式”。
以下是两个好工具:
TagSoup是一个开源程序,是由John Cowan开发的基于Java和SAX的工具。这是 一个用Java编写的兼容SAX的解析器,它不是解析格式良好或有效的XML,而是解析在野外发现的HTML:糟糕,讨厌和野蛮,尽管通常很短。 TagSoup专为那些必须使用某种理性应用程序设计来处理这些东西的人而设计。通过提供SAX接口,它允许将标准XML工具应用于最差的HTML。 TagSoup还包括一个命令行处理器,可以读取HTML文件并生成干净的HTML或格式良好的XML,这与XHTML非常接近。 Taggle是TagSoup的商业C ++端口。
SgmlReader是微软Chris Lovett开发的工具 SgmlReader是任何SGML文档的XmlReader API(包括内置的HTML支持)。还提供了一个命令行实用程序,它输出格式良好的XML结果 下载包含独立可执行文件和完整源代码的zip文件:SgmlReader.zip
答案 5 :(得分:2)
对于Ruby,我强烈推荐Jb Evain指出的Hpricot。如果你正在寻找一个更快的基于libxml的竞争对手,Nokogiri(参见http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也相当不错(它支持像Hpricot这样的XPath和CSS搜索,但速度更快)。有一个基本wiki和一些benchmarks。
答案 6 :(得分:1)
杰出成就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-mode为true())并放入
命名空间参数指定的命名空间(可能是“”表示
除非输入具有明确的命名空间声明,否则无命名空间
哪种情况会受到尊重。
如果html-mode = true()“
阅读更详细的说明here。
希望这会有所帮助。
干杯,
Dimitre Novatchev。
答案 7 :(得分:1)
有一个名为libxml2的XML的免费C实现,它有一些用于XPath的api位,我已经非常成功地使用它,您可以将HTML指定为正在加载的文档。对于我来说,这对于一些不完美的HTML文档来说很有用。
在大多数情况下,当入站HTML正确编码并且可以像“xml文档”一样阅读时,XPath最有用。您可能需要考虑使用特定于此目的的实用程序来清理HTML文档。以下是一个示例:http://tidy.sourceforge.net/
就这些XPath工具而言,您可能会发现大多数实现实际上都基于预先存在的C或C ++库,例如libxml2。