阅读:3321回复:24
tampermonkey 如何获取 这个网址的的文章正文内容
像起点的很简单,例如这个页面 https://read.qidian.com/chapter/YpTCe7ZNThACpOPIBxLXdQ2/83iDwee_bG6aGfXRMrUjdw2/
我用 bookname = $("#bookImg").text(); chapname = $(".content-wrap").text(); chaptext = document.querySelector(".read-content"); 就能获取 书名 章节名称 正文内容 但是下面这个网址的不知道如何获取 https://chuangshi.qq.com/bk/xh/AGwEMl1nVjYAOFRtATMBZg-r-1.html 我只会获取 书名 let test2 = $(".bookNav").contents().eq(6).text(); 谁帮我写个代码 获取章节名称 和 正文内容,谢谢 |
|
1楼#
发布于:2023-04-12 09:57
你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout
(function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname); alert(chaptext); })() |
|
2楼#
发布于:2023-04-12 15:13
|
|
3楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() { var chapname="abc"; (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); console.log(chapname+"这的代码怎么是最后运行啊") })() console.log(chapname+"这是后面的代码怎么先运行啊,我想后运行啊")我不会弄这个执行顺序,我想通过函数得到chapname等,然后后续进行一些处理, 可是好像是后面的代码都执行完了才运行function x()...怎么搞下才行 |
|
4楼#
发布于:2023-04-12 20:34
这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。
alert("这里写你获取内容前要做的事") (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } alert("把你获取内容前要做的事放这里也行") let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") })()会玩promise/async/await那套高级语法的,也可以把异步转成同步 async function waitChapter() { await new Promise((resolve)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); } alert("这里写你获取内容前要做的事") waitChapter(); let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") |
|
5楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。第一种通俗易懂我是明白的,但是我需要合并好几个网站, 就是 if 是1号网站 获取 书名 章节名称 正文内容 if 是2号网站 获取 书名 章节名称 正文内容 if 是3号网站 获取 书名 章节名称 正文内容 统一处理一下 最终重构一个简单的网页 document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>` 所以需要第二种 第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容 alert(chapname) alert(chaptext) 都是空的 什么都没有显示 帮忙修正下吧 或者 我哪里搞错了... |
|
6楼#
发布于:2023-04-13 10:41
你能用第二种方式,那就也能用第一种方式。两者在执行上是等价的,最多就是第一种可能会写出多重嵌套的函数不太好看而已。而且按你的需求,也碰不上多重嵌套,直接用一个函数来作最终处理就行了
if (location.hostname == "a.com") { (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); process(chapname, chaptext); })(); } else if (location.hostname == "b.com") { let chapname = $('xxxx').text(); let chaptext = $('yyyy').text(); process(chapname, chaptext); } function process(chapname, chaptext) { alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") } 如果用第二种获取不了,第一种也一样会发生同样情况的,这种事只是个概率问题,都是刚好碰上创建了.bookreadercontent还没有往里面填内容。你if换个判断条件就是了 |
|
7楼#
发布于:2023-04-13 12:17
taoww:你能用第二种方式,那就也能用第一种方式。两者在执行上是等价的,最多就是第一种可能会写出多重嵌套的函数不太好看而已。而且按你的需求,也碰不上多重嵌套,直接用一个函数来作最终处理就行了if (location.hostname == "a.co...回到原帖谢谢,这样把后面所有内容变成一个函数确实可以 但是第二种似乎不是概率事件,无限循环无法跳出,我弄了个test变量,他就不停地++,无法获取正确的章节名称 我不会换正确的if条件...,还是希望这个第二种能够实现,我好像进死胡同了 // ==UserScript== // @name test // @version 0.01 // @description test // @match https://chuangshi.qq.com/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; let test=1; async function waitChapter() { await new Promise((resolve)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { console.log(test++) setTimeout(x, 100); return; } resolve(); })(); }); } waitChapter(); let chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); let bookname = $(".bookNav").contents().eq(6).text(); document.body.innerHTML = ` ${bookname} ${chapname} `; })(); |
|
8楼#
发布于:2023-04-13 14:43
抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() { 'use strict'; let chapname, bookname; if (location.hostname == "chuangshi.qq.com") { await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); chapname = $('h1[data-node="chapterTitle"]').text(); bookname = $(".bookNav").contents().eq(6).text(); } else if (location.hostname == "aaaa.com") { bookname = $("xxx").text(); chapname = $("yyy").text(); } document.body.innerHTML = ` ${bookname} ${chapname} `; })(); |
|
9楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样完美!!! 这样我原先的代码 就99.999%都不用动了,感谢费时费力多番修改~ 从结果来看,就是第一行 (function() { 变成 (async function() { 然后增加新代码 等待载入, 其它照旧,perfect await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); });虽然 完全不懂 async await promise,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^ |
|
10楼#
发布于:2023-04-13 16:17
|
|
11楼#
发布于:2023-08-07 15:10
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样hello,高手,我又来咯 上次这个代码非常好使 // ==UserScript== // @name testok // @version 0.1 // @description test // @match https://chuangshi.qq.com/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (async function() { 'use strict'; let chaptext; console.log($(".bookreadercontent").length);//没问题 0 await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); console.log($(".bookreadercontent").length);//没问题 1 chaptext = document.querySelector(".bookreadercontent"); document.body.innerHTML = ` <div class="chaptext">${chaptext.innerHTML}</div> `; })();然后另一个网站suiyuexs.com的随意一个页面例如: https://www.suiyuexs.com/read/114583/23686286.html这个网站只要是服务器稍微慢点的情况下,就会 获取不到, 所以我我照猫画虎改了下,没成功, $("#txt").length没有载入的时候就==1了... 还是您帮我改改吧,hehe,下面是不行的代码 // ==UserScript== // @name test // @version 0.1 // @description test // @match https://www.suiyuexs.com/read/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (async function() { 'use strict'; let chaptext; console.log($("#txt").length);//有问题 即使没有加载成功也=1 await new Promise((resolve,reject)=>{ (function x(){ if ($("#txt").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); console.log($("#txt").length);// chaptext = document.querySelector("#txt"); document.body.innerHTML = ` <div class="chaptext">${chaptext.innerHTML}</div> `; })(); |
|
12楼#
发布于:2023-08-09 11:27
$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == "" 检查$("#txt")里面有没有文本,或者用 $("#txt").children().length == 0检查$("#txt")里面有没有其他非文本元素存在 |
|
13楼#
发布于:2023-08-09 13:57
|
|
14楼#
发布于:2024-04-05 13:32
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用hello,大神,好久不见,我又来向您求助了 帮忙看下这个链接, https://www.zongheng.com/detail/1203325?tabsName=catalogue 1.如何获取 点击右侧作者名字 或 作者头像 跳转到作者所有作品的链接,就是如何获取这个地址https://home.zongheng.com/people/19335221 2.如何获取 所有章节列表 其他小网站简单用 chaplist = $('#list').html();就行 这个复杂网站用 chaplist = $('.detail-catalog--chapter').html(); 不行,完全看不懂代码 |
|
上一页
下一页