2012-01-24 13 views
0

나는 웹 페이지에서 일부 데이터를 긁어해야합니다. 그러나 나는 그것을 몇 가지 인코딩 문제가있다. 여기PHP DOMXPath 인코딩

는 잘 알려진 독일어 웹 페이지에서 문제를 보여 다만 저 작은 샘플 코드입니다.

나는 웹 페이지에서이 텍스트를 얻을 것으로 예상 : VFL의 안쪽에서 바깥 강력한 설정 때문에
모든 비판은 볼프스부르크에 모습을 뻗어있다. 쾰른은 자신의 이익을 그릴 수 있습니까? 내 테스트에서 볼 수

는하지만,이 얻을 : VFL 적극적으로 거꾸로되었다 때문에
모든 비평가는 볼프스부르크에 모습을 뻗어있다. Kölner은 자신의 이익을 그릴 수 있습니까?

페이지의 메타 태그는 말한다, 그것은 UTF-8했다, 그것은 ... 그래서
UTF-8로 인코딩되고 mb_detect_encoding 말한다했다.

하지만이 엉터리 텍스트를 다시받을 이유는 무엇입니까?

내가 ISO 8859-1에 텍스트를 변환 할 때 내가 예상 결과를 얻을 ...

<?php 
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'; 

$url = "http://www.goal.com/de/match/60952/wolfsburg-vs-1-fc-k%C3%B6ln/preview"; 

$fileContent = @file_get_contents($url); 

$dom = @DOMDocument::loadHTML($fileContent); 
$xpath = new DOMXpath($dom); 

$element = $xpath->query(".//*[@id='article_headline']/h2"); 
if ($element->length > 0) { 
    $item = $element->item(0); 

    $text = $item->textContent; 
    echo $text . "<br>"; 

    $text = iconv("UTF-8", 'ISO-8859-1', $text); 
    echo $text . "<br>"; 
} 

?> 

답변

12

있는 DOMDocument의 HTML 파서 (libxml2를 인 모두) 입력의 인코딩을 추측하려고합니다. 일반적으로는 꽤 좋은 일을하지만,이 페이지는 병적 인 경우로 보인다. 아마도 동아시아 문자의 존재는 혼란된다. 당신은 당신이 인코딩 당신이 loadHTML() 방법에 공급하기 전에 7 비트 아스키에 텍스트를 강제로 알고 확신 어디에 이런 상황에서

. 당신과 같이이 작업을 수행 할 수 있습니다

$fileContent = mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8'); 

는 이름 또는 숫자 문자 엔티티 HTML로 모든 비 ASCII 문자를 변환합니다. 나는이 작업을 수행 할 때 페이지가 나를 위해 제대로 작동합니다.

+0

덕분에, 그게 내가 찾던입니다 :) – Urkman

0

페이지 자체가 캐릭터에게 DOMDocument를 예상하는 방법을 정의하지 않습니다. 예를 들어 :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

당신은 그것을로드하기 전에 HTML 중 하나를 패치, 또는 뭔가 다른 사용해야합니다 (XHTML 문서에있는 것으로 보이기 때문에 아마도 loadXML을?). 그것은 잘못된 HTML을 가로 질러 오면