我想在脚本标签中提取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
答案 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());