【发布时间】:2010-07-25 14:15:44
【问题描述】:
当我从某些页面抓取内容时,脚本会给出一个相对 URL。是否可以使用 Simple HTML DOM 获取绝对 URL?
【问题讨论】:
标签: php screen-scraping
当我从某些页面抓取内容时,脚本会给出一个相对 URL。是否可以使用 Simple HTML DOM 获取绝对 URL?
【问题讨论】:
标签: php screen-scraping
我认为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();
}
重复替换包含诸如background、cite、classid、codebase、data、longdesc、profile 和 usemap 等 URI 的任何其他属性(请参阅index of attributes in HTML 4.01 )。
【讨论】:
除了@Artefacto 的回答,如果您在某处输出抓取的 HTML,您可以简单地将 <base href="http://example.com"> 添加到文档的头部,这将为文档中的所有相对 URL 建立指定的基本 URL href。看看http://www.w3schools.com/tags/tag_base.asp
【讨论】:
编辑请参阅 Gumbo 的答案以获得正式正确的答案。这是一种简化的算法,适用于绝大多数情况,但在某些情况下会失败。
当然。这样做:
【讨论】: