如何使用Node.js解析HTML页面

时间:2011-09-10 16:18:08

标签: node.js html-parsing server-side

我需要解析(服务器端)大量的HTML页面 我们都同意regexp不是这里的方式。
在我看来,javascript是解析HTML页面的本地方式,但该假设依赖于具有浏览器内javascript所具有的所有DOM能力的服务器端代码。

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

6 个答案:

答案 0 :(得分:78)

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

其他选项包括:

  • BeautifulSoup for python
  • 您可以转换为html to xhtml并使用XSLT
  • HTMLAgilityPack for .NET
  • CsQuery for .NET(我的新宠)
  • spidermonkey和rhino JS引擎具有本机E4X支持。仅当您将html转换为xhtml时,这可能很有用。

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

答案 1 :(得分:60)

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

  

❤熟悉的语法:Cheerio实现了核心jQuery的子集。 Cheerio   从jQuery中删除所有DOM不一致和浏览器残缺   图书馆,揭示其真正华丽的API。

     

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

     

❁疯狂灵活:Cheerio环绕@ FB55的原谅   HTMLParser的。 Cheerio几乎可以解析任何HTML或XML文档。

答案 2 :(得分:7)

使用 htmlparser2 ,它的速度更快,非常简单。请参考此用法示例:

https://www.npmjs.org/package/htmlparser2#usage

现场演示:

http://demos.forbeslindesay.co.uk/htmlparser2/

答案 3 :(得分:5)

FB55的{p> Htmlparser2似乎是一个不错的选择。

答案 4 :(得分:1)

jsdom太严格了,不能做任何真正的屏幕抓取的东西,但beautifulsoup不会扼杀坏标记。

node-soupselect是python对nodejs的美丽的一个端口,它工作得很漂亮

答案 5 :(得分:0)

2020年11月更新

我搜索了顶级的NodeJS html解析器库。

因为用例不需要具有很多功能的库,所以我可以专注于稳定性和性能。

通过稳定性,我的意思是我希望社区能够足够长时间使用该库以查找错误,并且仍将对其进行维护,并解决未解决的问题。

很难理解开源库的未来,但是我根据openbase 中排名前10位的库做了一个小总结。

我根据最后一次提交分为两组(每组的顺序都按照Github的开始):

最近一次提交是在最近6个月内:

jsdom-df$A <- c(1,1,1,1,1,1,1,1,1,1) df #> A B #> 1 1 2 #> 2 1 3 #> 3 1 4 #> 4 1 5 #> 5 1 6 #> 6 1 7 #> 7 1 8 #> 8 1 9 #> 9 1 10 #> 10 1 11

htmlparser2- Last commit: 3 Months, Open issues: 331, Github stars: 14.9K

parse5- Last commit: 8 days, Open issues: 2, Github stars: 2.7K

swagger-parser- Last commit: 2 Months, Open issues: 21, Github stars: 2.5K

html-parse-stringify- Last commit: 2 Months, Open issues: 48, Github stars: 663

node-html-parser-Last commit: 4 Months, Open issues: 3, Github stars: 215

最后一次提交是6个月以上:

cheerio- Last commit: 7 days, Open issues: 15, Github stars: 205

koa-bodyparser- Last commit: 1 year, Open issues: 174, Github stars: 22.9K

sax-js- Last commit: 6 months, Open issues: 9, Github stars: 1.1K

draftjs-to-html- Last commit: 3 Years, Open issues: 65, Github stars: 941


我之所以选择Node-html-parser,是因为它看上去安静得很快,而且非常活跃。

(*)Openbase添加了有关每个库的更多信息,例如贡献者的数量(提交3次),每周下载,每月提交,版本等。

(**)上表是根据特定时间和日期的快照-我将再次检查参考,并且首先检查近期活动的水平,然后深入研究较小的细节。