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 : 获取所有的子元素
*请认真填写需求信息,我们会在24小时内与您取得联系。