簡體   English   中英

如何使用javascript導航獲取頁面上的所有鏈接?

[英]How to get all links on page with javascript navigation?

在經典HTML中很容易

$('a').map(function(){return this.href}).toArray()

但是,如果通過JavaScript完成導航,例如:

<a href='#' onclick='someFn()'>Some link</a>

沒有執行someFn函數就不可能知道url,如果你執行它 - 它不會返回url,而是導航頁面(我無法控制someFn函數,不知道里面是什么或者如何改變它)。

因此,為了從頁面獲取所有N個鏈接,您必須加載所有這N個頁面。 這非常緩慢且效率低下。

如何解決?

可能的解決方案 - 如果可以攔截對window.location調用 - 問題解決了。 您只需單擊所有這些鏈接並檢查window.location值,而無需加載新頁面。 但我不知道這是否可行(我使用phantomjs,它似乎無法做到)。

注意

即使在執行JavaScript之后,HTML中也沒有URL。 是的,在某些情況下,您可以使用瀏覽器模擬器來執行JS,然后解析在瀏覽器中動態生成的HTML。 但情況並非如此,我使用瀏覽器模擬器(phantomjs),但即使在JS執行后,HTML中也沒有URL和導航,所有導航都是在純JS中完成的,

<a onclick=tonsOfWeirdBlackBoxFunctionsYouCantChange>

如果您嘗試解析頁面上已執行的源,則需要使用正則表達式函數來搜索這些URL的字符串。

如果您嘗試在運行時為位置解析代碼並將它們保存到數組或其他東西--- JavaScript中的每個對象都具有toString函數。

那就是---如果你將functions定義為對象:

//Although you should really be using a parameter for this...
//...I'm trying to hold context with your use case.
var redirectToContact = function(){
  window.location = "/contact.html";
}

您可以redirectToContact.toString()並在其上運行正則表達式函數:

Mabye之類的:

var url = redirectToContact.toString();
console.log( url.match( 'window.location = "(.*)";' )[1] );

我想你想要做的是覆蓋window.location的原型。 這篇SO帖子解釋了如何做到一點: 是否有可能在Javascript中覆蓋window.location.hostname?

但是,您必須將javascript片段注入到在任何其他腳本之前運行的每個頁面。 我一直致力於Crawljax網絡爬蟲的類似功能。 我在這里使用相同的機制來檢測可點擊的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM