【问题标题】:Convert a relative URL to an absolute URL with Simple HTML DOM?使用简单 HTML DOM 将相对 URL 转换为绝对 URL?
【发布时间】:2010-07-25 14:15:44
【问题描述】:

当我从某些页面抓取内容时,脚本会给出一个相对 URL。是否可以使用 Simple HTML DOM 获取绝对 URL?

【问题讨论】:

    标签: php screen-scraping


    【解决方案1】:

    我认为Simple HTML DOM Parser 做不到。

    但是你可以自己做。首先,如果未另行声明,您需要区分作为文档 URI 的基本 URI(请参阅BASE element)。比获取每个 URI 引用并应用 algorithms to resolve a relative URI as described in RFC 3986(已经有一些类可以用于此,例如 PEAR package Net_URL2)。

    因此,使用这两个类,您可以执行以下操作:

    $uri = new Net_URL2('http://example.com/foo/bar'); // URI of the resource
    $baseURI = $uri;
    foreach ($html->find('base[href]') as $elem) {
        $baseURI = $uri->resolve($elem->href);
    }
    
    foreach ($html->find('*[src]') as $elem) {
        $elem->src = $baseURI->resolve($elem->src)->__toString();
    }
    foreach ($html->find('*[href]') as $elem) {
        if (strtoupper($elem->tag) === 'BASE') continue;
        $elem->href = $baseURI->resolve($elem->href)->__toString();
    }
    foreach ($html->find('form[action]') as $elem) {
        $elem->action = $baseURI->resolve($elem->action)->__toString();
    }
    

    重复替换包含诸如backgroundciteclassidcodebasedatalongdescprofileusemap 等 URI 的任何其他属性(请参阅index of attributes in HTML 4.01 )。

    【讨论】:

      【解决方案2】:

      除了@Artefacto 的回答,如果您在某处输出抓取的 HTML,您可以简单地将 <base href="http://example.com"> 添加到文档的头部,这将为文档中的所有相对 URL 建立指定的基本 URL href。看看http://www.w3schools.com/tags/tag_base.asp

      【讨论】:

      • 是的,我知道那个选项,但是当我必须抓取 2 个或更多站点时,这是不可能的。您可以将其用于脚本中的一次抓取,但是当您想要抓取 2 个站点时,这是不可能的。
      • @Jean,在这种情况下,您需要以编程方式更改您抓取的内容。
      【解决方案3】:

      编辑请参阅 Gumbo 的答案以获得正式正确的答案。这是一种简化的算法,适用于绝大多数情况,但在某些情况下会失败。

      当然。这样做:

      • 获取相对 URL(不以 http://https:// 或任何其他协议开头的 URL,也不以 / 开头的 URL)。
      • 获取页面的 URL。
      • 从中删除查询字符串(如果有)。一种简单的方法是在? 周围使用explode,然后获取结果数组的第一个元素(获取索引为0 的元素或使用reset)。
        • 如果页面的 URL 以 / 结尾,则将其附加到相对 URL 中,您就有了最终 URL。
        • 如果 URL 不以 / 结尾,则取其中的 dirname,并将其附加到相对 URL。您现在有了最终到达网址。

      【讨论】:

      • 感谢您的回答,但我必须如何在脚本中对此进行编程。
      • 谢谢大家,我试试看
      • @Jean 这概述了脚本的算法;如果您有进一步的困难,您可以发布后续问题。
      猜你喜欢
      • 2014-12-12
      • 2011-10-24
      • 2021-07-28
      • 2019-05-10
      • 1970-01-01
      • 2015-06-28
      • 2011-01-01
      • 2011-05-25
      相关资源
      最近更新 更多