Loading... # 遇到shadow-root ![image.png](http://type.zimopy.com/usr/uploads/2023/09/1861431120.png) # 这里先说用selenium ## 步骤 ### 注入js,将close改成open 这里可以用scriptcat也可以用油猴(为了在网页执行前注入,才有效) ```javascript // ==UserScript== // @name New Userscript // @namespace https://bbs.tampermonkey.net.cn/ // @version 0.1.0 // @description try to take over the world! // @author You // @match https://ygp.gdzwfw.gov.cn/* // ==/UserScript== (function() { Element.prototype._attachShadow = Element.prototype.attachShadow Element.prototype.attachShadow = function () { return this._attachShadow({mode:'open'}) } })(); ``` ### 编写js获取 ```javascript // for (let index = 0; index < document.querySelector('.richtext div').shadowRoot.querySelectorAll("tr").length; index++) { // document.querySelector('.richtext div').shadowRoot.querySelectorAll("div")[index].innerText // } // for (let index = 0; index < 27; index++) { // let kkk=document.querySelector('.richtext div').shadowRoot.querySelectorAll("div")[index].innerText; // console.log(kkk) // } // document.querySelector('.richtext div').shadowRoot.querySelectorAll("tr")[2].querySelectorAll("td")[0].querySelector("div").innerText let kkk = document.querySelector('.richtext div').shadowRoot.querySelectorAll("tr"); console.log(kkk.length); for (let index = 2; index < kkk.length - 1; index++) { let _td = kkk[index].querySelectorAll("td"); // console.log(_td.length) for (let index_p = 0; index_p < _td.length; index_p++) { try { let PPP = _td[index_p].querySelector("div").innerText; console.log(PPP); } catch (error) { } } } ``` ### 整理一下代码(网页里面调试) ```javascript // 看到没,网页变了代码也会变,js的docunment语法你就自己看了哈,具体获取数据就是这么获取的,我再给你跑一便 function huoyu() { let kkk = document.querySelector('.richtext div').shadowRoot.querySelectorAll("tr"); console.log(kkk.length); // 你需要调整的就是再js里面。封装好数据,然后python接收就行了 // 这个for是获取所有的tr 这个for一般不用动,主要是下面的for let tr_res = "" for (let index = 2; index < kkk.length - 1; index++) { let _td = kkk[index].querySelectorAll("td"); console.log(_td.length) // 这个for是区分表里面的 let td_res = "" for (let index_p = 0; index_p < _td.length; index_p++) { try { let PPP = _td[index_p].innerText; console.log(PPP); td_res += PPP + "----" } catch (error) {} tr_res += td_res+"###########";//这两个位置是我在这种情况下写的,其他页面会不合理 } } return tr_res; } huoyu() ``` # 注意,selenium > **selenium要获取执行js后的结果不能把js封装封城方法,而且还要return 以后的值出去** ### 下面的代码就是放到selenium执行的js文本 ```javascript // 看到没,网页变了代码也会变,js的docunment语法你就自己看了哈,具体获取数据就是这么获取的,我再给你跑一便 let kkk = document.querySelector('.richtext div').shadowRoot.querySelectorAll("tr"); console.log(kkk.length); // 你需要调整的就是再js里面。封装好数据,然后python接收就行了 // 这个for是获取所有的tr 这个for一般不用动,主要是下面的for let tr_res = "" for (let index = 2; index < kkk.length - 1; index++) { let _td = kkk[index].querySelectorAll("td"); console.log(_td.length) // 这个for是区分表里面的 let td_res = "" for (let index_p = 0; index_p < _td.length; index_p++) { try { let PPP = _td[index_p].innerText; console.log(PPP); td_res += PPP + "----" } catch (error) {} tr_res += td_res+"###########";//这两个位置是我在这种情况下写的,其他页面会不合理 } } return tr_res; ``` ### 最后会输入 ![image.png](http://type.zimopy.com/usr/uploads/2023/09/3367456982.png) # 提示 这个代码没有兼容性,自己更具具体情况封装输出内容 最后修改:2023 年 09 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏