2012-08-15 5 views
2

웹 사이트에서 내용을 긁어 내기 위해 Perl의 WWW :: Mechanize 라이브러리를 사용하고 있습니다. 그러나 웹 페이지의 원본 HTML 소스 코드와 WWW :: Mechanize에서 파싱 된 내용이 다르다는 것을 알았습니다. 결과적으로 내 스크립트의 일부 기능이 손상됩니다.Perl WWW :: Mechanize 구문 분석 콘텐츠 문제?

그래서, 여기에 스크립트 (일부 단지 오류/문제를 설명하기)

#! /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 페이지를 검색합니다.

스크립트를 실행하고 출력을 텍스트 파일로 리디렉션하여 분석 할 수 있도록합니다. 나는 source_code.txt과 브라우저 (파이어 폭스)에 의해 표시되는 웹 사이트의 실제 소스 코드를 비교할 때

perl test.pl >> source_code.txt 

지금, 차이가있다. 예를 들어

:

<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

User-Agent가 서버에서 반환 한 내용과 차이가 나는지 먼저 확인합니다. 'agent => 'Windows IE 6'을'new()'호출에 추가하면 어떻게 될까요? – LHMathies

답변

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 –

+1

감사합니다. 나는 사용자 에이전트를 사용해 보겠습니다. –

관련 문제