XPath는 좋은 보이는 경우에도 XPath는 속성 오류를 해결

mvsr :

나는 웹 페이지에서 버전 정보를 추출하기 위해 노력하지만 XPath는 HTML 페이지에 잘 보이는 경우에도 오류를 얻고있다.

코드 I는 시도

use DOMDocument;
use DOMXPath;
function getVersionFromDownloads(string $url): string
{
    // support only windows
    $content = $this->fetch($url);
    $curl = curl_init($url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
    $content = curl_exec($curl);
    curl_close($curl);

    $dom = new DOMDocument();
    @$dom->loadHTML($content);

    $xpath = new DOMXPath($dom);

    $result = $xpath->query("//a[contains(text(),'paint.net')]");

    $header = $result->item(0)->textContent;
    echo $header;

}
getVersionFromDownloads('https://www.dotpdn.com/downloads/pdn.html');

원하는 결과는 4.2.10

나는 HTML 페이지에서 확인할 때 XPath는 좋은 것 같아요 그리고 그것은 올바른 요소를 보이고있다. 나는 텍스트 내용을 추출하려고 할 때하지만 오류가 있습니다.

주어진 문장을 오류 : $header = $result->item(0)->textContent;

mickmackusa :

내 솔루션을 테스트하는 동안, 내가 사용하는 DOM 오류를 많이 얻고 있었다 $dom->load(). 당신은 같은 온라인 HTML 유효성 검사기를 사용하여 유효하지 않은 마크 업을 모두 볼 수 있습니다 https://www.freeformatter.com/html-validator.html . 이 프로그램은 다음 많은 미성년자의 decprecations 및 짖는 된 몇 가지 주목할만한 항목이 같은 :

잘못된 바이트 순서 : "A9".

잘못된 바이트 순서 : "AE".

나는 함께 스크립트 내 자신의 PHP 코드하려고 할 때 $dom->loadHTML()...

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->load('https://www.dotpdn.com/downloads/pdn.html');
$xpath = new DOMXPath($dom);
return libxml_get_last_error();

내가 가진 화면으로 반환 값을 인쇄 var_export()참조하십시오 :

LibXMLError :: __ set_state (배열 ( '레벨'=> 3 '코드'=> 77 '열'=> 8, '메시지'=> '태그 HTML 라인 1의 데이터 조기 단부', '파일'=> ' https://www.dotpdn.com/downloads/pdn.html ', '회선'=> 153))


권장

그래서 사용하는 대신 load(), 나는 시도하기로 결정 file_get_contents($url)소스 코드를 얻을 수 및 DOM 파서에 공급.

function getVersionFromDownloads($url)
{
    $dom = new DOMDocument();
    $dom->loadHTML(file_get_contents($url));
    $xpath = new DOMXPath($dom);
    $text = $xpath->query("//a[contains(text(),'paint.net')]")->item(0)->textContent;
    return preg_replace('/paint\.net\s+/', '', $text);
}
var_export(getVersionFromDownloads('https://www.dotpdn.com/downloads/pdn.html'));

산출:

'4.2.10'
  • 작은 따옴표를 제거하려면 사용하는 echo대신 var_export(). 난 단지 더 선행 또는 후행 공백이 없다는 것을 증명하는 데 사용했다.

  • preg_replace()되도록 리턴되기 전에 사용되는 paint.net문자열이 제거되어 내부 여러 연속 공백 하였다.

  • 공식적으로,이 추출 기술은 동일하게 작동합니다 :

     $xpath->query("//a[contains(text(),'paint.net')]/text()")->item(0)->nodeValue;
    
  • 당신을에서 :

     function getVersionFromDownloads(string $url): string
    

    : string요구는 문자열 값은 함수에서 반환됩니다,하지만 당신은 단지 반향된다 - 문자열 값을 반환해야합니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=278090&siteId=1