Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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查询也返回false_Php_Xpath_Utf 8 - Fatal编程技术网

Php 即使存在节点,XPath查询也返回false

Php 即使存在节点,XPath查询也返回false,php,xpath,utf-8,Php,Xpath,Utf 8,场景 我从一个使用PHP、DOMDOCUMENT和XPATH的网站上获取内容。我的代码确保HTML内容是UTF-8,并尝试删除与查询匹配的某些节点 问题所在代码的一部分 在PHP类中: libxml_use_internal_errors(true); $this->dom=new DOMDocument("4.01", "utf-8"); $xpath=new DOMXPath($this->dom); $this->motorConfig['xPath_N']="//div

场景

我从一个使用PHP、DOMDOCUMENT和XPATH的网站上获取内容。我的代码确保HTML内容是UTF-8,并尝试删除与查询匹配的某些节点

问题所在代码的一部分

在PHP类中:

libxml_use_internal_errors(true);
$this->dom=new DOMDocument("4.01", "utf-8");
$xpath=new DOMXPath($this->dom);
$this->motorConfig['xPath_N']="//div[@class='pdfprnt-bottom-right']/following-sibling::*";
$content_text_dirty='
... aleba</p><div class="pdfprnt-bottom-right">Y entonces...</div><div><p> ...
';

if($this->motorConfig['xPath_N']){
$content_text_dirty=str_replace("\0", '', $content_text_dirty); //Avoid PHP BUG http://stackoverflow.com/questions/30925533/php-dom-loadhtml-method-unusual-warning
$this->dom->loadHTML(mb_convert_encoding($content_text_dirty, 'HTML-ENTITIES', "UTF-8"), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath=new DOMXPath($this->dom); //her cuz must be set after loading HTML into DOM
$nodes_to_remove=$xpath->query($this->motorConfig['xPath_N']);
var_dump($nodes_to_remove); --> bool(false)
...

我已经使用这个PHP类很长一段时间了,从不同的网站上获取数据。但这只会在某些特定的网站上偶尔发生。目前的情况是:。[实际上,使用FirePath尝试相同的xpath查询会返回匹配项]

作为启动程序,只需查看XML(此处未显示)和xpath即可。PHP代码并不重要。然后使用任何工具(在线或本地)以交互方式针对XML运行XPath表达式,这将使您能够非常轻松地使用该表达式进行实验。您将
$this->motorConfig['XPath\N']
设置为XPath字符串,然后使用不同的字符串执行XPath查询
$nodes\u to\u remove=$XPath->->query($this->motorConfig['xPath_MAKIFLAKI']);
这是故意的吗?@KeithHall Ups,很抱歉这个错误。我在发布问题时将MAKIFLAKI重命名为N,这样更容易阅读。(我也修复了问题中的错误。)-谢谢。@dret谢谢:)我用firefox扩展试用过,效果很好,所以问题不在查询字符串本身。我在问题的底部提到了来源。我猜这是DOM中的某种错误编码问题。我们将继续研究并在这里发布信息。首先,请看一下XML(此处未显示)和XPath。PHP代码并不重要。然后使用任何工具(在线或本地)以交互方式针对XML运行XPath表达式,这将使您能够非常轻松地使用该表达式进行实验。您将
$this->motorConfig['XPath\N']
设置为XPath字符串,然后使用不同的字符串执行XPath查询
$nodes\u to\u remove=$XPath->->query($this->motorConfig['xPath_MAKIFLAKI']);
这是故意的吗?@KeithHall Ups,很抱歉这个错误。我在发布问题时将MAKIFLAKI重命名为N,这样更容易阅读。(我也修复了问题中的错误。)-谢谢。@dret谢谢:)我用firefox扩展试用过,效果很好,所以问题不在查询字符串本身。我在问题的底部提到了来源。我猜这是DOM中的某种错误编码问题。将继续研究并在这里发布信息。
str_replace("\0", '', $content_text_dirty);