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


92

我需要解析(服务器端)大量的HTML页面。
我们都同意,regexp不是行之有效的方法。
在我看来,javascript是解析HTML页面的本机方式,但是这种假设取决于服务器端代码,该代码具有javascript在浏览器内部具有的所有DOM功能。

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

Answers:


87

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

其他选项包括:

在所有这些选项中,我更喜欢使用Node.js选项,因为它使用了标准的W3C DOM访问器方法,并且我可以在客户端和服务器上重用代码。我希望BeautifulSoup的方法与W3C dom更相似,并且我认为将HTML转换为XHTML以编写XSLT简直是可悲的。


3
你是什​​么意思?可靠,快速,容易吗?结合这两个,它足够健壮,因此您可以使用jQuery服务器端
2011年

1
@kzh如果过程在1个小时或一天之内结束,那么对我而言,可靠和轻松就显得尤为重要。
伊泰·莫阿夫

我要说的是,node选项是可靠的,而且如果您已经习惯DOM的话,肯定很容易。
2011年

如果您为htmlparser拍摄,请尝试首先使用github.com/fb55/node-htmlparser。它似乎是经过重新设计的版本,并且得到了更加积极的维护。
cburgmer's

我在互联网上搜索了所有内容,但找不到htmlparser的好教程。.–
songyy

62

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

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

ϟ快速发展:Cheerio使用非常简单,一致的DOM模型工作。结果,解析,操作和渲染都非常高效。初步的端到端基准测试表明,cheerio比JSDOM快8倍。

flexible非常灵活:Cheerio将@ FB55宽容的htmlparser环绕起来。Cheerio可以解析几乎任何HTML或XML文档。


8
但是不建立DOM,也不允许XPath。jQuery语法肯定是该库的缺点。
polkovnikov.ph 2014年

2
以我的经验,@ polkovnikov.ph很少有应用程序需要完整的DOM解析,并且与jQuery / Cheerio中的快速“懒惰”评估相比,构建DOM的成本非常高。从这个意义上讲,jQuery样式的解析是一个好处,但是如果您的应用程序需要操纵DOM服务器端,则您可能更喜欢尝试jsdom。
Meekohi 2014年

jsdom太慢了:/
polkovnikov.ph 2014年

2
@MohamedMansour值得我们在生产中使用Cheerio,并在几秒钟内刮掉数千页。当然,“快速”和“慢速”都与您的应用程序和带宽有关。
Meekohi,2016年

非严格:+1。jQuery语法:+1。
cheesus


6

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


3
这种返回格式应该怎么做?写一堆for循环和树遍历?
polkovnikov.ph 2014年

您可以注册以打开/关闭标签事件,因此根据您的需要,这是一个非常好的替代恕我直言。
Phil 2015年

@ polkovnikov.ph 同一作者也有一个domutils包,它使用htmlparser2返回的格式-它有很多方法,其中有些语法与DOM方法相同,有些则不同。您将不需要手动遍历对象。那里没有文档,但是源代码非常清晰-一切都如您所愿。
特别是2015年

还没有,但是什么阻止您扩展它呢?使用现有功能并不难。
特别是2015年

2

jsdom过于严格,无法执行任何实际的屏幕抓取操作,但是beautifulsoup不会因不良标记而窒息。

node-soupselect是python的beautifulsoup移植到nodejs的端口,它的工作原理很漂亮

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.