繁体   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