javascript - 从网站上抓取表格,使用 javascript :subOpen href link

标签 javascript google-apps-script google-sheets web-applications

我想为这个页面上的每个链接抓取后面的页面详细信息页面。

我可以获得此页面上的所有信息:PAGE

但是,我想在详细信息页面上获取所有信息,但是 href 链接看起来像这样,例如:

href="javascript:subOpen('9ca8ed0fae15d43dc1257e7300345b99')"

这是我使用 ImportHTML 函数获取总体概览的示例电子表格。

Google Spreadsheet

有什么关于如何获取详细信息页面的建议吗?

更新

我实现了以下方法:

function doGet(e){
  var base = 'http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/'
  var feed =  UrlFetchApp.fetch(base + 'suche?OpenForm&subf=e&query=%28%5BVKat%5D%3DEH%20%7C%20%5BVKat%5D%3DZH%20%7C%20%5BVKat%5D%3DMH%20%7C%20%5BVKat%5D%3DMW%20%7C%20%5BVKat%5D%3DMSH%20%7C%20%5BVKat%5D%3DGGH%20%7C%20%5BVKat%5D%3DRH%20%7C%20%5BVKat%5D%3DHAN%20%7C%20%5BVKat%5D%3DWE%20%7C%20%5BVKat%5D%3DEW%20%7C%20%5BVKat%5D%3DMAI%20%7C%20%5BVKat%5D%3DDTW%20%7C%20%5BVKat%5D%3DDGW%20%7C%20%5BVKat%5D%3DGA%20%7C%20%5BVKat%5D%3DGW%20%7C%20%5BVKat%5D%3DUL%20%7C%20%5BVKat%5D%3DBBL%20%7C%20%5BVKat%5D%3DLF%20%7C%20%5BVKat%5D%3DGL%20%7C%20%5BVKat%5D%3DSE%20%7C%20%5BVKat%5D%3DSO%29%20AND%20%5BBL%5D%3D0').getContentText();

       var d = document.createElement('div'); //assuming you can do this
       d.innerHTML = feed;//make the text a dom structure
       var arr = d.getElementsByTagName('a') //iterate over the page links
       var response = "";
       for(var i = 0;i<arr.length;i++){
         var atr = arr[i].getAttribute('onclick');
         if(atr) atr = atr.match(/subOpen\((.*?)\)/) //if onclick calls subOpen
         if(atr && atr.length > 1){ //get the id
            var detail = UrlFetchApp.fetch(base + '0/'+atr[1]).getContentText();
            response += detail//process the relevant part of the content and append to the reposnse text
         }
        }      
       return ContentService.createTextOutput(response);
}

但是,我在运行该方法时遇到错误:

ReferenceError: "document" is not defined. (line 6, file "")

什么是文档的对象?

我已经更新了 Google Spreadsheet使用网络应用程序。

最佳答案

您可以使用 Firebug 来检查页面内容和 javascript。例如,您会发现 subOpen 实际上是在 xmlhttp01.js 中声明的 subOpenXML 的别名。 .

function subOpenXML(unid) {/*open found doc from search view*/
 if (waiting) return alert(bittewar);
 var wState = dynDoc.getElementById('windowState');
 wState.value = 'H';/*httpreq pending*/
 var last = '';
 if (unid==docLinks[0]) {last += '&f=1'; thisdocnum = 1;}
 if (unid==docLinks[docLinks.length-1]) {
  last += '&l=1';
  thisdocnum = docLinks.length;
 } else {
  for (var i=1;i<docLinks.length-1;i++)
   if (unid==docLinks[i]) {thisdocnum = i+1; break;}
 }
 var url = unid + html_delim + 'OpenDocument'+last + '&bm=2';
 httpreq.open('GET',    // &rand=' + Math.random();
  /*'/edikte/test/ex/exedi31.nsf/0/'+*/ '0/'+url, true);
 httpreq.onreadystatechange=onreadystatechange;
// httpreq.setRequestHeader('Accept','text/xml');
 httpreq.send(null);
 waiting = true;
 title2src = firstTextChild(dynDoc.getElementById('title2')).nodeValue;
}

因此,在复制函数源并在 firebug 的控制台选项卡中修改它以在 http 调用之前添加 console.log(url) 之后,如下所示:

 var url = unid + html_delim + 'OpenDocument'+last + '&bm=2';
 console.log(url)
 httpreq.open('GET',    // &rand=' + Math.random();
  /*'/edikte/test/ex/exedi31.nsf/0/'+*/ '0/'+url, true);

您可以在 firebug 的控制台选项卡中执行函数声明,并用修改后的源代码覆盖 subOpen。 单击链接然后将显示调用的 url 由作为参数传递给 subOpen 的 id 组成,前缀为“0/”,因此在您发布的示例中它将是一个 GET 到:

http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/0/1fd2313c2e0095bfc1257e49004170ca?OpenDocument&f=1&bm=2

您还可以通过在 firebug 中打开“网络”选项卡并单击链接来验证这一点。

因此,为了抓取您需要的详细信息页面

  1. 解析传递给subOpen的id
  2. 对“0/”进行 GET 调用
  3. 解析请求响应

查看 firebug 的网络选项卡中的请求响应表明,您可能需要进行类似的解析才能真正获得显示的内容,但我没有深入研究。

更新 importHTML 函数不适合您想要的那种抓取。谷歌的HTMLContent服务更适合于此。您需要创建一个 web app并实现 doGet 函数:

function doGet(e){
  var base = 'http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/'
  var feed =  UrlFetchApp.fetch(base + 'suche?OpenForm&subf=e&query=%28%5BVKat%5D%3DEH%20%7C%20%5BVKat%5D%3DZH%20%7C%20%5BVKat%5D%3DMH%20%7C%20%5BVKat%5D%3DMW%20%7C%20%5BVKat%5D%3DMSH%20%7C%20%5BVKat%5D%3DGGH%20%7C%20%5BVKat%5D%3DRH%20%7C%20%5BVKat%5D%3DHAN%20%7C%20%5BVKat%5D%3DWE%20%7C%20%5BVKat%5D%3DEW%20%7C%20%5BVKat%5D%3DMAI%20%7C%20%5BVKat%5D%3DDTW%20%7C%20%5BVKat%5D%3DDGW%20%7C%20%5BVKat%5D%3DGA%20%7C%20%5BVKat%5D%3DGW%20%7C%20%5BVKat%5D%3DUL%20%7C%20%5BVKat%5D%3DBBL%20%7C%20%5BVKat%5D%3DLF%20%7C%20%5BVKat%5D%3DGL%20%7C%20%5BVKat%5D%3DSE%20%7C%20%5BVKat%5D%3DSO%29%20AND%20%5BBL%5D%3D0').getContentText();
       var response = "";
       var match = feed.match(/subOpen\('.*?'\)/g)
       if(match){
         for(var i = 0; i < match.length;i++){
              var m = match[i].match(/\('(.*)'\)/);
              if(m && m.length > 1){
                var detailText = UrlFetchApp.fetch(base + '0/'+m[1]);
                response += //dosomething with detail text 
                            //and concatenate in the response
              }
         }
       }
       return ContentService.createTextOutput(response);


}

关于javascript - 从网站上抓取表格,使用 javascript :subOpen href link,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557335/

相关文章:

javascript - StickorStay JQuery 函数,错误

javascript - Angular 种子项目 - angular-loader-js 依赖

javascript - 使用 Apps 脚本在内存中创建一个新的 blob

html - 使用 Google Doc AddOn 的 Apps 脚本处理 'drop' 事件

filter - 对于没有数据的单元格,Google 表格 Vlookup 结果中出现“不匹配”消息

javascript - Jquery - ScrollTop 延迟..很多

javascript - ComponentWillMount 触发不停止?

label - 长标签文本中的换行

arrays - 在 Google 表格中将 2D 范围转换为带有空格的 1D 数组

google-apps-script - 当用户打开工作表或单击工作表中的链接时,Google Sheets 附加组件会自动打开