Selenium 2:检测链接目标的内容类型

Posted

技术标签:

【中文标题】Selenium 2:检测链接目标的内容类型【英文标题】:Selenium 2: Detect content type of link destinations 【发布时间】:2011-07-23 23:08:59 【问题描述】:

我正在使用 Selenium 2 Java API 与网页交互。我的问题是:如何检测链接目的地的内容类型?

基本上,这是背景:在单击链接之前,我想确保响应是 html 文件。如果没有,我需要以另一种方式处理它。因此,假设有一个 PDF 文件的下载链接。应用程序应该直接读取该 URL 的内容,而不是在浏览器中打开它。

我们的目标是让应用程序自动知道当前位置是 HTML、PDF、XML 还是其他任何内容,以使用适当的解析器从文档中提取有用信息。

更新

增加赏金:将奖励给允许我获取给定 URL 的内容类型的最佳解决方案。

【问题讨论】:

【参考方案1】:

正如 Jochen 所建议的,在不下载内容的情况下获取 Content-type 的方法是 HTTP HEAD,而 selenium webdrivers 似乎不提供这样的功能。您必须找到另一个库来帮助您获取 url 的内容类型。

可以做到这一点的 Java 库是 Apache HttpComponents,尤其是 HttpClient。

(以下代码未经测试)

HttpClient httpclient = new DefaultHttpClient();
HttpHead httphead = new HttpHead("http://foo/bar");
HttpResponse response = httpclient.execute(httphead);
BasicHeader contenttypeheader = response.getFirstHeader("Content-Type");

System.out.println(contenttypeheader);

该项目发布JavaDoc for HttpClient,HttpClient interface 的文档包含一个很好的示例。

【讨论】:

我仍然对那段代码有疑问。即使响应正常,实体也始终为空。 可能是 HttpHead 响应不包含 HttpEntity。我已更改示例以从响应中获取 Content-type 标头,但仍未经测试。【参考方案2】:

您可以从 DOM 中检索所有 URL,然后解析每个 URL 的最后几个字符(使用 java 正则表达式)以确定链接类型。

您可以解析从最后一个点开始的字符。例如,在 url http://yoursite.com/whatever/test.pdf 中,提取 pdf,并相应地强制执行您的测试逻辑。

我是否过度简化了您的问题?

【讨论】:

我觉得这太简单了。许多 URL 类似于 /generateImage.php?name=test,可以是任何图形格式。我想我需要自己获取链接内容。【参考方案3】:

您可以确定内容类型将处理传入的数据。 不知道为什么你需要先弄清楚这一点。 如果是这样,请使用 HEAD 方法并查看 Content-Type 标头。

【讨论】:

如果我事先没有弄清楚,Firefox 可能会显示一些我想避免的下载弹出窗口。 在这种情况下,HEAD 是要走的路。它为您提供了您将从 GET 调用中获得的所有标头,但没有实际内容。 我找不到合适的方法来获取响应头。记住,我使用的是 Selenium 2。

以上是关于Selenium 2:检测链接目标的内容类型的主要内容,如果未能解决你的问题,请参考以下文章

动手学CV-目标检测入门教程2:VOC数据集

动手学CV-目标检测入门教程2:VOC数据集

如何在selenium IDE中单击iFrame中的链接

目标检测领域中的数据不均衡问题综述

目标检测领域中的数据不均衡问题综述

OpenCV实战——基于均值漂移算法检测图像内容