Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解决xpath属性错误,即使xpath看起来不错_Php_Xpath_Web Scraping - Fatal编程技术网

Php 解决xpath属性错误,即使xpath看起来不错

Php 解决xpath属性错误,即使xpath看起来不错,php,xpath,web-scraping,Php,Xpath,Web Scraping,我试图从网页中提取版本信息,但是我得到了一个错误,尽管XPath在HTML页面上看起来不错 我试过的代码是 use DOMDocument; use DOMXPath; function getVersionFromDownloads(string $url): string { // support only windows $content = $this->fetch($url); $curl = curl_init($url); curl_seto

我试图从网页中提取版本信息,但是我得到了一个错误,尽管XPath在HTML页面上看起来不错

我试过的代码是

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

 $result = explode(" ",trim($xpath->query("//b/a")[0]->nodeValue))[1];
这就是你要找的吗


这就是您想要的吗?

在测试我的解决方案时,我使用
$DOM->load()
得到了很多DOM错误。您可以使用联机html验证程序(如)查看所有无效标记。 该节目对许多次要的声明和一些值得注意的项目进行了抨击,如:

格式错误的字节序列:“a9”

格式错误的字节序列:“ae”

当我试图用
$dom->loadHTML()编写自己的php代码时,

$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\u export()
将返回值打印到屏幕上,以查看:

LibXMLError::uu设置_u状态(数组('level'=>3,'code'=>77,'column'=>8,'message'=>'标记html第1行中的数据过早结束','file'=>'','line'=>153,))


推荐

因此,我没有使用
load()
,而是决定尝试
file\u get\u 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\u export()
    。我只是用它来证明没有前导或尾随空格

  • 返回前使用
    preg_replace()
    ,以便删除
    paint.net
    ,然后删除字符串中的多个连续空格

  • 对于记录,此提取技术的工作原理相同:

     $xpath->query("//a[contains(text(),'paint.net')]/text()")->item(0)->nodeValue;
    
  • 在您的:

     function getVersionFromDownloads(string $url): string
    
    :string
    要求从函数返回一个字符串值,但您只是在回显——请确保返回一个字符串值


在测试我的解决方案时,我使用
$DOM->load()
得到了很多DOM错误。您可以使用联机html验证程序(如)查看所有无效标记。 该节目对许多次要的声明和一些值得注意的项目进行了抨击,如:

格式错误的字节序列:“a9”

格式错误的字节序列:“ae”

当我试图用
$dom->loadHTML()编写自己的php代码时,

$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\u export()
将返回值打印到屏幕上,以查看:

LibXMLError::uu设置_u状态(数组('level'=>3,'code'=>77,'column'=>8,'message'=>'标记html第1行中的数据过早结束','file'=>'','line'=>153,))


推荐

因此,我没有使用
load()
,而是决定尝试
file\u get\u 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\u export()
    。我只是用它来证明没有前导或尾随空格

  • 返回前使用
    preg_replace()
    ,以便删除
    paint.net
    ,然后删除字符串中的多个连续空格

  • 对于记录,此提取技术的工作原理相同:

     $xpath->query("//a[contains(text(),'paint.net')]/text()")->item(0)->nodeValue;
    
  • 在您的:

     function getVersionFromDownloads(string $url): string
    
    :string
    要求从函数返回一个字符串值,但您只是在回显——请确保返回一个字符串值


dom是否太大而无法在此处提供?你能
var_转储($result->item(0))?@mickmackusa它给出
NULL
。xpath->query中似乎有一些内容。但在inspect元素中,它只显示正确的元素。我认为您的curl/fetch可能有问题。作为一名开发人员,我们希望您能够找出最早的破坏点。dom是否太大而无法在这里提供?你能
var_转储($result->item(0))?@mickmackusa它给出
NULL
。xpath->query中似乎有一些内容。但在inspect元素中,它只显示正确的元素。我认为您的curl/fetch可能有问题。我们希望你,作为一名开发人员,能够找出最早的破损点。这绝对不是解决办法。OP并没有在查询中苦苦挣扎,而是在这之前获取DOM。在正确检索到的DOM字符串上使用OP的查询是可行的——因此问题不在于查询。即使这个答案确实解决了问题(而且没有),它也不会清理它显然正试图做的输出。证据:另外,这是一个只包含代码的答案——所有答案都应该解释——这绝对不是解决方案。OP并没有在查询中苦苦挣扎,而是在这之前获取DOM。在正确检索到的DOM字符串上使用OP的查询是可行的——因此问题不在于查询。即使这个答案确实解决了问题(而且没有),它也不会清理它显然正试图做的输出。证明:另外,这是一个只包含代码的答案——所有答案都应该解释清楚