2012-08-15 72 views
2

我使用WWW :: Mechanize库来从网站刮取内容。但是,我注意到网页的原始HTML源代码和WWW :: Mechanize解析的内容不同。因此,脚本中的一些功能会被破坏。Perl WWW ::机械化解析内容问题?

所以,这里是脚本(一个子集,只是为了演示错误/问题)

#! /usr/bin/perl 

use WWW::Mechanize; 
use warnings; 

$mech=WWW::Mechanize->new(); 
$mech->stack_depth(0); 

$url="http://www.example.com"; 

$mech->get($url); 

print $mech->content; 

短期和简单的代码,它会连接到网站和检索整个HTML页面。

我运行脚本并将输出重定向到文本文件,以便我可以分析它们。

perl test.pl >> source_code.txt 

现在,当我比较source_code.txt和由浏览器(Firefox)中显示的网站的实际的源代码,也有不同之处。

例如:

<tr> 
<td nowrap="nowrap">This is Some Text</td> 
<td align="right"><a href="http://example.com?value=key">Some more Text</a></td> 
</tr><tr> 

上述源代码是什么是在浏览器中观察到的。 (查看页面源代码功能)

然而,在文本文件中,source_code.txt(由WWW ::机械化生成)

它表明:

<tr> 
<td nowrap="nowrap">This is some text</td> 
<td align="right">This is some more text</td> 
</tr><tr> 

正如你所看到的,锚标签它被嵌套在第二组标签之间被删除。

这是已知问题还是我需要使用$ mech-> content以外的其他东西来查看源代码?

谢谢。

+1

我会首先检查用户代理是否对服务器返回的内容产生影响。如果您在'new()'调用中添加'agent =>'Windows IE 6''会发生什么? – LHMathies 2012-08-15 10:36:23

回答

4

这是一种常见行为,如"user agent sniffing",例如,对于盲人用户,页面将以不同方式显示。你可以改变你的用户代理字符串与不同的插件,浏览器,也可以作为@LHMathies说,在WWW ::机械化看到UserAgent.pmMechanize->new

例子:

my $mech = WWW::Mechanize->new(agent => 
    'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)' 
); 

a list of common user agent strings看到。

+1

还有' - > agent_alias()'方法,尽管这些别名很久没有更新过了。 http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.pm#$mech-%3Eagent_alias%28_$alias_%29 – 2012-08-17 21:12:05

+1

谢谢。我将尝试与用户代理。 – 2012-08-18 01:06:54