cheerio在脚本标签中查找文本

时间:2018-12-18 19:00:33

标签: javascript node.js cheerio

我想在脚本标签中提取js脚本。

此脚本标签:

<script>
  $(document).ready(function(){

    $("#div1").click(function(){
      $("#divcontent").load("ajax.content.php?p=0&cat=1");
    });

    $("#div2").click(function(){
      $("#divcontent").load("ajax.content.php?p=1&cat=1");
    });

  });
</script>

我有一个['div1', 'div2']之类的ID数组,我需要在其中提取URL链接: 所以如果我调用一个函数:

getUrlOf('div1');

它将返回ajax.content.php?p=0&cat=1

2 个答案:

答案 0 :(得分:1)

使用Cheerio,很容易获得script标签的文本:

const cheerio = require('cheerio');
const $ = cheerio.load("the HTML the webpage you are scraping");

// If there's only one <script>
console.log($('script').text());

// If there's multiple scripts
$('script').each((idx, elem) => console.log(elem.text()));

从这里开始,您实际上只是在问“我如何解析通用JavaScript块并提取链接列表”。我在评论中同意以上Patrick的观点,您可能不应该同意。 您可以设计一个正则表达式,让您找到脚本中的每个链接并推断出链接到的页面吗?是。但是很有可能,如果与此页面有关的任何更改发生,您的脚本都会立即中断-该页面的作者可能会切换到内联<a>标签,重构代码,使用实时事件等。

请注意,依靠此script标记的确切内容将使您的应用程序非常脆弱-甚至比通常的页面抓取还要脆弱。

编辑:当然,这是一个松散但有效的正则表达式的示例:

let html = "incoming html";
let regex = /\$\("(#.+?)"\)\.click(?:.|\n)+?\.load\("(.+?)"/;
let match;

while (match = regex.exec(html)) {
    console.log(match[1] + ': ' + match[2]);
}

如果您是正则表达式的新手,则此表达式包含两个捕获组(在括号中)(第一个是div id,第二个是链接文本),以及一个 non-captureing 组位于中间,仅用于确保正则表达式将通过换行符继续。我说它是“宽松”的,因为它正在寻找的匹配看起来像这样:

  • $(“ ***”)。单击***ignored chars***。load(“ ***

因此,根据存在的JavaScript数量和相似程度,您可能必须将其收紧以避免误报。

答案 1 :(得分:0)

如果您使用的是较新版本的cheerio(1.0.0-rc.2),则需要使用.html()而不是.text()

const cheerio = require('cheerio');
const $ = cheerio.load('<script>script one</script>  <script>  script two</script>');

// For the first script tag
console.log($('script').html());

// For all script tags
console.log($('script').map((idx, el) => $(el).html()).toArray());

https://github.com/cheeriojs/cheerio/issues/1050