使用简单的 HTML DOM 将相对 URL 转换为绝对 URL?
当我从某些页面抓取内容时,脚本会给出一个相对 URL。是否可以使用简单的 HTML DOM 获取绝对 URL?
When I'm scraping content from some pages, the script gives a relative URL. Is it possible to get a absolute URL with Simple HTML DOM?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不认为 简单 HTML DOM 解析器 可以做到这一点。
但你可以自己做。首先,如果没有另外声明,您需要区分作为文档 URI 的基本 URI(请参阅
BASE
元素)。然后获取每个 URI 引用并应用 算法来解析相对 URI,如 RFC 中所述3986 (已经有一些类可供您使用,例如 PEAR 包 Net_URL2 )。因此,使用这两个类,您可以执行以下操作:
重复替换包含 URI 的任何其他属性,例如
background
、cite
、classid
、codebase
、data
、longdesc
、profile
和usemap
(请参阅HTML 4.01 中的属性索引)。I don’t think that the Simple HTML DOM Parser can do that.
But you can do that on your own. First you need to distinguish the base URI that is the URI of the document if not declared otherwise (see
BASE
element). Than get each URI reference and apply the algorithms to resolve a relative URI as described in RFC 3986 (there already are classes you can use for that like the PEAR package Net_URL2).So, using these two classes, you could do something like this:
Repeat the substitution for any other attribute containing a URI like
background
,cite
,classid
,codebase
,data
,longdesc
,profile
andusemap
(see index of attributes in HTML 4.01).除了@Artefacto的答案之外,如果您在某处输出抓取的HTML,您可以简单地将
添加到文档的头部,这会将文档中所有相对 URL 的基本 URL 建立为指定的href
。看看http://www.w3schools.com/tags/tag_base.aspIn addition to @Artefacto's answer, and if you are outputting the scraped HTML somewhere, you could simply add
<base href="http://example.com">
to the head of the document, which will establish the base URL for all relative URLs in the document as the specifiedhref
. Have a look at http://www.w3schools.com/tags/tag_base.asp编辑请参阅 Gumbo 的答案以获得正式的正确答案。这是一种简化的算法,适用于绝大多数情况,但在某些情况下会失败。
当然。执行此操作:
http://
、https://
或任何其他协议开头的 URL,也不以以/
开头)。explode
around?
然后获取结果数组的第一个元素(获取索引为0
的元素或使用reset< /代码>
)。- 如果页面的 URL 以
- 如果网址不以
/
结尾,请在其后面附加相对 URL,您就得到了最终 URL。/
结尾,则采用dirname
,并附加相对 URL。您现在已经有了最终的网址。EDIT See Gumbo's answer for a formally correct answer. This is a simplified algorithm that will work in the vast majority of cases, but fail on some.
Sure. Do this:
http://
,https://
, or any other protocol, and also doesn't start with/
).explode
around?
and then take the first element of the resulting array (take element with index0
or usereset
)./
, append it the relative URL and you have the final URL./
, takedirname
of it, and append it the relative URL. You now have the final URL.