2015-07-22 117 views
9

我想爲本頁上的每個鏈接追查頁面後面的詳細信息頁面。從網站刮臉,用javascript:subOpen href鏈接

我能得到這個網頁上的所有信息:PAGE

不過,我想獲得的所有信息的詳細信息頁面上,但在href鏈接看起來像,例如:

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

以下是使用ImportHTML函數獲得總體概述的示例電子表格。

Google Spreadsheet

任何建議如何獲得詳細信息頁面?

UPDATE

我採取了以下方法:

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 "")

什麼是document的對象?

我用webapp更新了Google Spreadsheet

我感謝您的回覆!

+0

[此問題]的副本(http://stackoverflow.com/questions/31452272/google-app-script-urlfetch-not-giving-html-output-but-javascript-ouput)。 – Mogsdad

回答

6

您可以使用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的控制檯選項卡執行的函數聲明並用修改的源碼覆蓋子打開。 Clickin中的鏈接,然後將顯示該調用的網址是由作爲參數傳遞的ID來subOpen「0 /」前綴,所以在這個例子中你張貼這將是一個GET到:

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

你也可以通過打開螢火蟲中的網絡標籤並點擊鏈接來驗證。

因此,爲了湊詳細信息頁面你需要

  1. 解析傳遞給subOpen
  2. 進行GET呼叫ID爲「0 /」
  3. 解析請求響應

在firebug的Network Tab中查看請求響應表明可能需要執行類似的解析才能真正獲得顯示的內容,但我沒有深入研究它。

UPDATE importHTML函數並不適合你想要的那種抓取。 Google的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); 


} 
+0

Thx爲您的答案!我不得不說,我對谷歌腳本語言並不太熟悉,因此,如果能夠幫助我在谷歌電子表格中顯示我想要的內容,我將不勝感激。我會自己解析解析。 – mrquad

+1

剛剛更新了答案 – Grasshopper

+0

Thx爲您的答案!但是,我仍然遇到錯誤,請查看我的更新! – mrquad

-1

如果你有Java的背景位,你可以使用http://htmlunit.sourceforge.net/(或其他測試框架)放棄任何種類的網頁。它支持Java腳本交互以及實用程序方法來獲取網頁元素。