如何使用PHP从XPath中获取结果?

3

我正在尝试使用php从xpath/html中获取文本,但没有成功。有什么想法。

例如: https://safeweb.norton.com/report/show?url=google.com

我的xpath(我已经仔细检查过了) //*[@id="bodyContent"]/div/div/div[3]/div[1]/div[1]/div[2]/div[1]/div/b

我想要在这里出现一个结果<div> result </div>,使用php

以下是我的代码:

<?php
public function getNortonSafe($domain)
{
  try
  {
    $callback_url = "https://safeweb.norton.com/report/show?url=google.com"; //. $domain;

    $curl_response = $this->curl->get($callback_url);

    if ($curl_response->headers['Status-Code'] == "200") {

      libxml_use_internal_errors(TRUE);
      $this->dom_doc->loadHTML($curl_response);
      libxml_use_internal_errors(FALSE);

      $xpath = new DOMXPath($this->dom_doc);
      $tmp = $xpath->query('//*[@id="bodyContent"]/div/div/div[3]/div[1]/div[1]/div[2]/div[1]/div/b')->item(0)->textContent);

      $tmp = explode(' ', trim($tmp));
      $norton_site_test = str_replace(",", "", $tmp[0]);

    } else {
      $norton_site_test = "0";
    }

    $response = array(
      'status' => 'success',
      'data' => array(
        'norton_site_test' => filter_var($norton_site_test, FILTER_SANITIZE_STRING)
      )
    );

  }
  catch (Exception $e)
  {
    $response = array(
      'status' => 'error',
      'msg' => $e->getMessage()
    );
  }
  return $response;
}
?>

HTML

<body>
<p id="norton_site_test">  result-text-here </p>
</body>

你的XPath查询非常复杂,你确定它不能简化吗?这样深层嵌套很容易出错。 - Flying
2个回答

1
当执行$xpath->query('some xpath here')->text(0)时,会出现错误:Fatal error: Call to undefined method DOMNodeList::text()。请检查您的PHP error reporting设置。 DOMXPath::query方法返回一个DOMNodeList对象,该对象仅具有item方法(请参见DOMNodeList)。 您需要调用: $xpath->query('some xpath here')->item(0)->textContent 来获取接收到的DOMNodeList对象中第一个节点的文本内容。

我尝试了但仍然不起作用 - 我认为这里有问题 'norton_site_test' => filter_var($norton_site_test) 如何过滤 text?提前感谢。 - damikongaccontdito
我应该使用 filter_var($norton_site_test,textContent) 吗? - damikongaccontdito
只需使用htmlspecialchars函数即可。 - camelsWriteInCamelCase

0

关于这段代码的更新,感谢@camelsWrite - 现在它已经可以正常工作了!使用这个干净的代码并进行了测试:

    

    public function getNortonSafe($domain)
    {
        try
        {
            $callback_url = "https://safeweb.norton.com/report/show?url= . $domain; //e.g $url: "https://safeweb.norton.com/report/show?url=google.com
$curl_response = $this->curl->get($callback_url);
if ($curl_response->headers['Status-Code'] == "200") {
libxml_use_internal_errors(TRUE); $this->dom_doc->loadHTML($curl_response); libxml_use_internal_errors(FALSE);
$xpath = new DOMXPath($this->dom_doc); $tmp = $xpath->query('//*[@id="bodyContent"]/div/div/div[3]/div[1]/div[1]/div[2]/div[1]/div/b')->item(0)->textContent);
$tmp = explode(' ', trim($tmp)); $norton_site_test = str_replace(",", "", $tmp[0]);
} else { $norton_site_test = "0"; }
$response = array( 'status' => 'success', 'data' => array( 'norton_site_test' => filter_var($norton_site_test) ) );
} catch (Exception $e) { $response = array( 'status' => 'error', 'msg' => $e->getMessage() ); } return $response; } ?>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接