fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
阅读:1731回复:24

tampermonkey 如何获取 这个网址的的文章正文内容

楼主#
更多 发布于:2023-04-12 08:36
像起点的很简单,例如这个页面 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();
谁帮我写个代码 获取章节名称 和 正文内容,谢谢
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
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);
})()
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
2楼#
发布于:2023-04-12 15:13
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
感谢帮助,我菜  MutationObserver 完全不知道怎么用
就用你这个~~~~我去捣鼓捣鼓
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
3楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
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()...怎么搞下才行
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
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("这里写你获取内容后要做的事")
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
5楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。
alert("这里写你获取内容前要做的事")
(function x() {
  if ($(".bookrea...
回到原帖
第一种通俗易懂我是明白的,但是我需要合并好几个网站,
就是
if 是1号网站 获取 书名 章节名称 正文内容
if 是2号网站 获取 书名 章节名称 正文内容
if 是3号网站 获取 书名 章节名称 正文内容
统一处理一下
最终重构一个简单的网页
document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>`


所以需要第二种
第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容
alert(chapname)    alert(chaptext) 都是空的 什么都没有显示
帮忙修正下吧 或者 我哪里搞错了...
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
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换个判断条件就是了
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
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)=&gt;{
      (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}
  `;
  
})();
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
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)=&gt;{
      (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}
  `;
 
})();
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
9楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美!!!  这样我原先的代码 就99.999%都不用动了,感谢费时费力多番修改~
从结果来看,就是第一行
(function() { 变成 (async function() {

然后增加新代码 等待载入, 其它照旧,perfect
await new Promise((resolve,reject)=&gt;{
  (function x(){
    if ($(".bookreadercontent").length == 0) {
      setTimeout(x, 100);
      return;
    }
    resolve();
  })();
});
虽然 完全不懂 async await promise,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
10楼#
发布于:2023-04-13 16:17
taoww
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美的代码
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
11楼#
发布于:2023-08-07 15:10
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() {
  'use strict';
 
  let chapname...
回到原帖
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)=&gt;{
    (function x(){
      if ($(".bookreadercontent").length == 0) {
        setTimeout(x, 100);
        return;
      }
      resolve();
    })();
  });
  
  console.log($(".bookreadercontent").length);//没问题 1
  
  chaptext = document.querySelector(".bookreadercontent");
  
  document.body.innerHTML = `
    &lt;div class="chaptext"&gt;${chaptext.innerHTML}&lt;/div&gt;
  `;
})();
然后另一个网站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)=&gt;{
    (function x(){
      if ($("#txt").length == 0) {
        setTimeout(x, 100);
        return;
      }
      resolve();
    })();
  });
  
  console.log($("#txt").length);//
  
  chaptext = document.querySelector("#txt");
  
  document.body.innerHTML = `
    &lt;div class="chaptext"&gt;${chaptext.innerHTML}&lt;/div&gt;
  `;
})();
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-04-15
  • 发帖数625
  • 经验571枚
  • 威望0点
  • 贡献值110点
  • 好评度99点
12楼#
发布于:2023-08-09 11:27
$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == ""

检查$("#txt")里面有没有文本,或者用
$("#txt").children().length == 0
检查$("#txt")里面有没有其他非文本元素存在
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
13楼#
发布于:2023-08-09 13:57
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == ""
检查$("#txt")里面有没有文本,或者用
$("#txt").children().length == 0检查$("...
回到原帖
谢谢改写和解答,$("#txt")存在我是知道的,我"盲猜"里面text之类的也是有点什么的 至于里面有什么 有多少 完全不知道不明白  哈哈 就是这么菜
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-04-20
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
14楼#
发布于:2024-04-05 13:32
taoww:$("#txt")这个一开始就存在的话,你就换个判定方式啊,比如用
$("#txt").text() == ""
检查$("#txt")里面有没有文本,或者用
$("#txt").children().length == 0检查$("...
回到原帖
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(); 不行,完全看不懂代码
上一页
游客

返回顶部