格式错误的网址与perl中的断开链接

时间:2013-07-02 16:38:03

标签: perl url

我希望区分网址中的拼写错误和实际断开的链接。例如:

错字: www.google/com

断开的链接: www.thislinkpointstonothing.org

我希望我的应用程序将第一个URL识别为错误形式,并指示第二个URL返回查询时未找到的404。我是否可以使用perl模块或正则表达式进行区分?

我正在尝试区分由于拼写错误导致的错误链接或 - 如果链接遵循RFC - 如果错误链接仅仅是由于页面不再存在。

1 个答案:

答案 0 :(得分:0)

您正在谈论两种不同类型的“查询”:DNS查找和HTTP请求。 HTTP请求使用DNS查找 - 但并非总是如此。例如,服务器可以位于本地网络上,您可以使用/etc/hosts文件中的IP地址和名称信息从中请求页面。链接名称可能并不总是包含主机名部分,因为它们可以是相对的(这通常是一种很好的做法,可以使网站轻松地移动到反向代理之后或者主机名更改。

考虑到这一区别,您的问题的要点 - 是否可以检查URI的正确性与真正缺失的aa页面(404)的链接是否合理 - 但{{1}的DNS查询应该鼻涕成功。您的应用程序是否被代理重定向到搜索页面?

接下来是一个粗略的近似答案 - 这可能不会有多大用处,但你会得到这个想法。对于google/com中更有用的方法,您可能想要检查一些更具特色的perl框架(perl Catalyst)是否具有执行此操作的方法。此外,如果您为前端UI(即网页上的Mojo)执行此操作,则可能会有更成熟的方法更快或更简单。以下步骤似乎与您想要对每个链接执行的操作相同:

1检查链接/ URI是否“正常”;如果没有打印错误;如果是的话:

2在链接/ URI的主机部分进行DNS查找;如果没有打印错误;如果成功那么:

3尝试获取网页并打印任何错误,或者如果成功则说明

测量“成功”很难自动化:它应该严格定义为“200 OK”状态吗?也许您或其他成员可以添加该部分,并找到一种优雅的方式来阅读“链接”(破坏或其他)。

此脚本大肆使用javascript来隐藏内容,而不会使用our。请有人让它看起来更好,只使用CORE :: modules: - )

use strict

输出:

use Regexp::Common qw/URI/;                                    
use Net::DNS;                       
use 5.10.0;                                                                 
use LWP::UserAgent; 

my $url = "http://www.google.com/adsfdsa" ;  
my $lookup = Net::DNS::Resolver->new;                                       
my $ua = LWP::UserAgent->new;                                               

### Step 0. regexp the URI  ##                                              

if ($url =~ /$RE{URI}{HTTP}{-keep}/){                                       
  say "$url is a URI ";                                                 
  our $hostpart = $3;  # stash the host part as per man page                
  our $filepart = $5;  # stash the path                                     
}                                                                           

### Step 1.  do a DNS look up and if it succeeds then or else ... etc. ###      

if ($lookup->query($hostpart))  { say "$hostpart is a valid host" }         
else { say " but $hostpart is an invalid host" }                            

###  Step 2. fetch the page and check the return code ###                   

my $request = HTTP::Request->new(GET => $url);                              
my $response = $ua->request($request);                                      

if ($response->is_success || $response->is_redirect ) {                     
    print $request->content;                                                
}                                                                           
else {                                                                      
  say "but $filepart is an invalid path";                                   
}  

您可以从输入中读取类似上述内容(但更短,更优雅,更高效!)并将相应的消息返回给您的用户,即从错误发生的任何地方返回:即在步骤0,1或2 )。请注意,有可能更快,更简单的方法来执行此操作,但http://www.google.com/adsfdsa is a URI www.google.com is a valid host but /adsfdsa is an invalid path Regexp::Common等模块已得到很好的锻炼和测试。