【问题标题】:Using Simple HTML DOM to get *absolute* URLs使用简单的 HTML DOM 获取 *absolute* URLs
【发布时间】:2012-12-03 07:16:22
【问题描述】:

我想做的事: 使用 Simple HTML DOM 对页面中的所有链接进行缩放,同时注意获取完整链接(即从 http:// 一直到地址末尾) .

我的问题:我得到了/wiki/Cell_wall 之类的链接,而不是http://www.wikipedia.com/wiki/Cell_wall

更多示例:如果我抓取 URL:http://en.wikipedia.org/wiki/Leaf,我会得到像 /wiki/Cataphyll//en.wikipedia.org/ 这样的链接。或者,如果我正在抓取 http://php.net/manual/en/function.strpos.php,我会得到类似 function.strripos.php 的链接。

我尝试了很多不同的技术来构建实际的完整 URL,但是有很多可能的情况,我完全不知道如何才能覆盖所有基础。

但是,我敢肯定有很多人以前遇到过这个问题 - 这就是我求助于你的原因!

P.S 我想这个问题几乎可以简化为只处理本地hrefs,但如上所述,我遇到过//en.wikipedia.org/,它不是一个完整的网址,但也不是本地的。

【问题讨论】:

  • 为此使用正则表达式,请参阅此处的正则表达式stackoverflow.com/questions/833469/regular-expression-for-url
  • 你需要刮很多页吗?因为除了使用刮板,您还可以使用无头 javascript (phantomjs.org),因此您可以使用 javascript 获取 url。然而,这意味着它比仅仅抓取它要慢得多。
  • 我认为你的问题应该简化为:如何在 PHP 中结合绝对 url 和相对 url。
  • 为什么你不能只检查 URL 是否以 http:// 开头,如果不是,只需连接你正在抓取的 URL。 (如果 URL 以 / 开头,您只需将其与基本 URL 连接。)
  • @DC_ 我试过这个,但偶然发现了一些问题,如上:抓取http://en.wikipedia.org/wiki/Leaf(基本URL),我得到/wiki/Cataphyll之类的链接。连接:http://en.wikipedia.org/wiki/Leaf/wiki/Cataphyll ...这没有多大意义。我原以为/wiki/Cataphyll应该链接到http://en.wikipedia.org/wiki/wiki/Cataphyll,因为它的开头有一个'/',但它实际上链接到http://en.wikipedia.org/wiki/Cataphyll

标签: php web-crawler simple-html-dom


【解决方案1】:

我想这就是你要找的。它在一个旧项目上对我有用。

http://www.electrictoolbox.com/php-resolve-relative-urls-absolute/

【讨论】:

  • 发现必须urldecode库输出URL,否则会在每个循环中从相对URL连接分页查询字符串(即使unseting)。
【解决方案2】:

您需要一个将相对 URL 转换为绝对 URL 的库。 URL To Absolute 似乎很受欢迎。然后你就:

require('url_to_absolute.php');

foreach($doc->find('a[href]') as $a){
  echo url_to_absolute('http://en.wikipedia.org/wiki/Leaf', $a->href) . "\n";
}

有关库列表,请参阅 PHP: How to resolve a relative url

【讨论】:

  • 网站坏了
  • 已将 URL 更新为 Absolute,编辑被拒绝,URL 仍然损坏。
【解决方案3】:

我不知道这是否是您要查找的内容,但这将为您提供执行页面的完整 URL:

window.location.href

希望对你有帮助。

【讨论】:

    【解决方案4】:

    好的,谢谢大家的cmets。

    我认为解决方案是使用正则表达式查找任何特定 URL 的 webroot,然后简单地将本地地址附加到此。

    棘手的部分: 设计一个适用于所有域的正则表达式语句,包括它们的子域...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多