2011-09-10 212 views
72

我需要解析(服务器端)大量的HTML页面。
我们都同意,正则表达式不是去这里的路。
在我看来,JavaScript是解析HTML页面的原生方式,但这种假设依赖于服务器端代码具有浏览器内部的所有DOM能力。如何使用Node.js解析HTML页面

Node.js是否有内置的能力?
有没有更好的方法来解决这个问题,在服务器端解析HTML?

回答

66

您可以使用npm模块jsdomhtmlparser在Node.JS中创建和分析DOM。

其他选项包括:

  • BeautifulSoup为蟒蛇
  • 你可以转换你html to xhtml和使用XSLT
  • HTMLAgilityPack为.NET
  • CsQuery为.NET(我的新宠)
  • spidermonkey和rhino JS引擎具有本地E4X支持。这可能是有用的,只有当你将你的html转换为xhtml。

在所有这些选项中,我更喜欢使用Node.js选项,因为它使用标准的W3C DOM访问器方法,并且我可以在客户端和服务器上重复使用代码。我希望BeautifulSoup的方法更类似于W3C dom,我认为将您的HTML转换为XHTML来编写XSLT只是普遍的虐待行为。

+3

是解析如何使用Node.js虽然HTML的好办法? –

+3

你的意思是什么?可靠,快速,简单?那么这两个,它足够强大,以便您可以[如果您想使用jQuery服务器端](http://stackoverflow.com/questions/1801160/can-i-use-jquery-with-node-js)。 – kzh

+5

+1 - 如果你想使用节点,这是要走的路。 – josh3736

0

在.NET中,有HTML Agility Pack,这是一个非常可靠的HTML解析库。

+3

这是否适用于Node.JS? – kzh

+4

@kzh:不,但我阅读的问题(和OP的[评论](http://stackoverflow.com/questions/7372972/how-do-i-parse-a-html-page-with-node- js/7373003#comment-8899571))是他对其他[非节点]选择开放。 – josh3736

4

Htmlparser2通过FB55似乎是一个很好的选择。

+3

应该怎么处理[这个返回格式](http://demos.forbeslindesay.co.uk/htmlparser2/)?写一堆for循环和树遍历? –

+0

你可以注册打开/关闭标签事件,所以根据你想要的,这是一个非常好的替代imho。 – Phil

+0

@ polkovnikov.ph同样的作者也有[domutils](https://github.com/FB55/domutils)包裹,它与htmlparser2返回的格式一起工作 - 它有很多方法,其中一些具有相同的方法DOM方法的语法,有些不同;你不会真的需要手动遍历对象。没有文档,但源代码非常清晰 - 它的工作原理与您所期望的一样。 – esp

1

jsdom太严格,无法做任何真正的屏幕抓取事情,但美丽的oup不会扼杀糟糕的标记。

node-soupselect是Python beautifulsoup成的的NodeJS一个端口,它精美的作品

52

使用Cheerio。它不像jsdom那样严格,并且针对抓取进行了优化。作为奖励,使用你已经知道的jQuery选择器。

❤熟悉的语法:Cheerio实现了核心jQuery的一个子集。 Cheerio 删除了jQuery 库中的所有DOM不一致和浏览器,显示出其真正华丽的API。

ϟ快速:Cheerio使用非常简单,一致的DOM 模型。因此,解析,操作和渲染的效率令人难以置信。初步的端到端基准测试表明,cheerio的速度比JSDOM快8倍左右。

❁非常灵活:Cheerio环绕@ FB55's原谅 htmlparser。 Cheerio可以解析几乎任何HTML或XML文档。

+6

但是不构建DOM并且不允许XPath。 jQuery语法肯定是该库的一个缺点。 –

+1

@ polkovnikov.ph在我的经验中,很少有应用程序需要完整的DOM解析,并且与jQuery/Cheerio中的快速“懒惰”评估相比,构建DOM是非常昂贵的。从这个意义上讲,jQuery风格的解析是一个好处,但是如果你的应用程序需要操纵DOM服务器端,你可能更愿意尝试jsdom。 – Meekohi

+0

'jsdom'太慢了:/ –