当抓取页面时,如何从<或者<frame >属性


When crawling a page, how to get full URL from <a href> or <frame src> attributes

我实际上使用PHP,但这种爬行可以由任何编程语言完成。要应付很多情况会有点困难。请帮我看一下这个问题,并给我一些建议,告诉我是否走对了方向。

我所知道的是当前的url地址,从中我可以从<a href="<frame src="获得链接列表。

我所做的是:从当前的url地址,我可以先得到根url,例如,从http://www.abc.com/def,我可以先得到http://www.abc.com。这是为了满足<a href="/fff.html"的情况,所以我必须首先知道根url。

其次,我需要从当前url获取url目录,这有点困难,我仍然不知道如何完美地完成它。例如,从http://www.abc.com/def/xyz.htm,它的url目录是http://www.abc.com/def。这是为了满足<a href="../../xyz.html">的情况。

我面临的问题是,如何获得当前的url目录?例如,如果当前的url是http://www.abc.com/def,我怎么知道def是一个目录还是一个文件?如果def是一个文件,那么url目录将是http://www.abc.com。但如果def是一个目录,那么url目录就是http://www.abc.com/def。

你可以说,如果最后有"/",那么它将是目录。但从我的角度来看,当我在抓取网页时,我不能确保网页构建器会在目录url的末尾添加"/"。目录url是完全有效的,例如,如果def是一个目录,那么http://www.abc.com/def可能代表http://www.abc.com/def/index.html。

由于很难知道http://www.abc.com/def是目录还是脚本文件,因此很难从相对href(如<a href="xyz.html">)中生成完整的url。

我是不是把问题复杂化了?有什么解决办法吗?

还有其他情况,例如href="#意味着锚,那么我就把它附加到当前url的末尾。这是正确的和有效的任何当前的url情况?这意味着,对于当前url为http://www.abc.com/def (def是一个目录)的情况是否有效,将http://www.abc.com/def#xyz转换为http://www.abc.com/def/index.html#xyz吗?

对于href="javascript: "或href="vbscript:等,我将忽略它。

And for href="xyz.?? " And if ??是一个图像文件,exe文件,或任何无效的html,我就忽略它们吗?

谢谢。

这个问题可能有点乱,我希望我解释清楚了。

域名后的任何内容都可以映射到配置域名的人想要的任何内容。

不能保证以.html结尾的URL指向文件系统中某个地方的真实文件,也不能保证它将返回有效的HTML或其他任何内容。

您可以任意决定将def/作为目录或文件名的一部分,因为任何选择都是同样正确的。

如果http://www.abc.com/def是一个目录,那么web服务器通常会重定向到http://www.abc.com/def/,以避免混淆客户端。您只需要注意重定向并使用urlparse.urljoin()或语言选择中的适当函数即可。像浏览器那样将两个组件融合在一起。

相关文章: