我需要解析(服务器端)大量的HTML页面
我们都同意regexp不是这里的方式。
在我看来,javascript是解析HTML页面的本地方式,但该假设依赖于具有浏览器内javascript所具有的所有DOM能力的服务器端代码。
Node.js是否内置了该功能?
有没有更好的方法解决这个问题,在服务器端解析HTML?
答案 0 :(得分:78)
您可以使用npm模块jsdom和htmlparser在Node.JS中创建和解析DOM。
其他选项包括:
在所有这些选项中,我更喜欢使用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)
答案 3 :(得分:5)
答案 4 :(得分:1)
jsdom太严格了,不能做任何真正的屏幕抓取的东西,但beautifulsoup不会扼杀坏标记。
node-soupselect是python对nodejs的美丽的一个端口,它工作得很漂亮
答案 5 :(得分:0)
我搜索了顶级的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次),每周下载,每月提交,版本等。
(**)上表是根据特定时间和日期的快照-我将再次检查参考,并且首先检查近期活动的水平,然后深入研究较小的细节。