整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

深入挖掘:如何使用JavaScript抓取页面上的所有script标签

s 获取页面中的script标签,这是网上的一段代码,经测试,可以获取。

var child = document.children;

var arr = [];//用来存放获取到的所有的标签

function fn(obj) {

for (var i = 0; i < obj.length; i++) {

if (obj[i].children) {//当当前元素还存在子元素的时候,递归

fn(obj[i].children);

}

arr.push(obj[i]); //遍历到的元素添加到arr这个数组中间

}

}

fn(child);

console.log(arr);//打印出最后获取到的结果

for (var i = (arr.length - 1); i >= 0; i--) {

console.log(arr[i]);

}

其实,这段JavaScript代码的主要目的是获取当前页面中的所有DOM元素,包括script标签,并将它们存储在一个数组中。然而,它实际上并没有针对script标签进行特殊处理,而是获取了document.children的所有直接子元素及其子孙元素。

如果要专门获取页面中的所有script标签,我们可以稍微修改一下这段代码:

var arr = [];

function collectScripts(obj) {

for (var i = 0; i < obj.length; i++) {

if (obj[i].nodeName === 'SCRIPT') { // 当前元素为script标签时

arr.push(obj[i]);

}

if (obj[i].children && obj[i].children.length > 0) {

collectScripts(obj[i].children); // 如果当前元素还存在子元素,则递归查找

}

}

}

// 遍历整个文档对象模型以查找script标签

collectScripts(document.getElementsByTagName('html')[0].children);

console.log(arr); // 打印出所有找到的script标签

for (var i = (arr.length - 1); i >= 0; i--) {

console.log(arr[i]);

}

看结果:


这里,我们首先通过document.getElementsByTagName('html')[0].children来获取HTML文档的顶层子元素,然后在遍历过程中检查每个元素是否是script标签,如果是则将其添加到数组arr中。同时保留了原有的递归结构,以便能够捕获嵌套在其他标签内的script标签。非常完美的实现了获取页面中的script标签。你也可以复制到浏览器的控制台试试。非常好用!

一天,老板不满地说:“喂,你这C#爬虫怎么连标题都没给我抓回来?我需要的是一份完整的报告,包括所有网页的标题,赶紧给我重新抓一遍!”那一刻,我仿佛看到了老板眼中闪烁的怒火,感受到了他对我工作的失望。

我仿佛看到了老板眼中闪烁的怒火,就像是火山即将爆发前的预兆。我心里咯噔一下,知道这次可能玩大了。

我赶紧赔着笑脸说:“老板,真不好意思,这次是我的失误。我马上就去给您抓回那些‘逃跑’的标题!”

其实我心里暗笑,因为那些标题我早就抓回来了,只是故意没展示出来。这可是职场生存法则啊,不能一次交出所有秘密,得留点悬念,让老板对你始终保持期待和好奇。你觉得这样做对吗?欢迎讨论,哈哈!

代码其实很简单:

// 使用XPath查询获取title标签
HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
//这行代码是使用C#的HtmlAgilityPack库来从HTML文档中提取<title>标签的内容。
//目的是从doc表示的HTML文档中选择第一个<title>标签,并将这个标签的节点对象赋值给titleNode变量。
如果要获取<title>标签中的文本内容,这样写:
string titleText = titleNode?.InnerText;
这里,?.是一个null条件运算符,如果titleNode为null(也就是说没有找到<title>标签),
则titleText会被赋值为null,否则,它会被赋值为<title>标签中的文本内容。

这个代码是怎么使用的呢?下面我解释下实现过程:

        static string? ParseTitleData(string htmlContent)
        {
            if (string.IsNullOrEmpty(htmlContent))
            {
                return null;
            }
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(htmlContent);
            // 使用XPath查询获取title标签
            HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
            if (titleNode != null)
            {
                // 获取title节点的文本内容
                string titleText = titleNode.InnerText.Trim();
                return "页面标题: " + titleText;
            }
            else
            {
                // 如果没有找到title标签,返回null
                return null;
            }
        }
//这段代码定义了一个名为 ParseTitleData 的静态方法,
//它接受一个 htmlContent 字符串作为输入,并试图从中解析出网页的标题。
//该方法使用 HtmlAgilityPack 库来解析 HTML 内容。

是不是很简单?这个方法的目的是从给定的 HTML 内容中提取网页的标题。如果成功找到标题,它会返回一个包含 "页面标题: " 和实际标题的字符串。如果 HTML 内容为空、null 或不包含 <title> 标签,它会返回 null。

看效果:


完整代码是包括如何异步获取网页内容的。如果有朋友需要的话,请关注我并留言,今天就写到这吧,太晚了,休息啦!

.情况

  • 当我们使用js解析Html文档的时候,经常需要获取某个元素下的子节点 , 这时我们会发现, 我们获取到的节点数量跟我们实际在页面中看到的好像不太一样

    <ol> <li>魔兽争霸</li> <li>反恐精英</li> <li>红色警戒</li> </ol>
  • 比如上面这段代码, 我们明明看到的只有三个子项, 可是有时在遍历的时候会出现不是三个子项的情况

2.原因

  • 节点

    <ol>(text)<li>魔兽争霸</li>(text)</ol>
  • 元素

    <ol><li>魔兽争霸</li></ol>
  • 两个标签中的中间隔的部分都是节点 , text 和 element都是节点

  • 下面这段代码中, ol 开始标签到 li 开始标签中间的这部分我们就称之为text节点

  • li 开始标签到 li 接收标签这部分我们称之为element节点

  • 由开始标签和结束标签组成的部分

  • 下面这段代码中, ol 开始标签和 ol 结束标签组成的一组我们称之为一个元素 , li 开始标签和 li 结束标签组成的一组也称之为是一个标签

  • 在所有的dom结构中,子项分为两种

  • 所以, 上面的上面的代码中, ol 元素下有三个节点 , 一个元素

3.解决办法

  • js为每个元素提供了两个属性

  • childNodes : 获取所有的子节点

  • children : 获取所有的子元素