Php 解决xpath属性错误,即使xpath看起来不错
我试图从网页中提取版本信息,但是我得到了一个错误,尽管XPath在HTML页面上看起来不错 我试过的代码是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
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的查询是可行的——因此问题不在于查询。即使这个答案确实解决了问题(而且没有),它也不会清理它显然正试图做的输出。证明:另外,这是一个只包含代码的答案——所有答案都应该解释清楚