【问题标题】:How to get navigable links to pages from a site using jsoup?如何使用 jsoup 从站点获取指向页面的可导航链接?
【发布时间】:2017-06-13 06:08:15
【问题描述】:

我正在实现一个基本的爬虫,目的是稍后在漏洞扫描器中使用。我正在使用 jsoup 来连接/检索和解析 html 文档。

我手动提供目标站点 (www.example.com) 的基础/根目录并连接。

...
Connection connection = Jsoup.connect(url).userAgent(USER_AGENT);
Document htmlDocument = connection.get();
this.htmlDocument = htmlDocument;
...

然后我检索页面上的所有链接。

...
Elements linksOnPage = htmlDocument.select("a[href]");
... 

之后,我在链接之间循环并尝试获取网站上所有页面的链接。

for (Element link : linksOnPage) {
                this.links.add(link.absUrl("href"));
    }

问题如下。根据我获得的链接,有些可能不是指向新页面的链接,甚至根本不是指向页面的链接。例如,得到的链接如下:

我需要一些帮助来过滤链接,以便我只获得指向同一根/基本站点的新页面的链接。

【问题讨论】:

  • 检查链接是否以域名开头:link.startsWith("http://www.ics.uci.edu/")
  • jsoup 中的 Element 对象没有像“startsWith”这样的方法,并且不以基本域(/pages.page2.html)开头的链接可能仍然在同一个站点上,只是使用js 导航。
  • 获取Element link对象的字符串url。并在url 上调用startsWith。使用js进行导航的链接必须有共同的属性。您可以按它们过滤
  • 使用String absUrl = linkElement.attr("href"); if(absUrl.startsWith("http://www.ics.uci.edu/")){//this is url within your site}
  • 这解决了一些无法使用的链接,但我发现仍然有这种格式的链接可以指向文档或图像。例如:example.com/wp-content/gallery/despre-noi/3-2.jpgexample.com/wp-content/uploads/2015/05/17-HGR-890.pdf

标签: java html web-crawler jsoup anchor


【解决方案1】:

这很容易。检查absUrl是否以图片格式或js或css结尾:

if(absUrl.startsWith("http://www.ics.uci.edu/") && !absUrl.matches(".*\\.(bmp|gif|jpg|png|js|css)$")) 
{

    //here absUrl starts with domain name and is not image or js or css
}

【讨论】:

  • 这适用于大多数情况,因为您可以根据需要添加新的扩展,但必须有更好的通用解决方案。从这里jsoup.org/apidocs 我发现原来的选择器“Elements linksOnPage = htmlDocument.select("a[href]");”可以使用像 img[src~=(?i)\\.(png|jpe?g)] 这样的正则表达式进行修改。问题是我发现很难构建一个排除 .html 旁边的通用文件扩展名的正则表达式。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多