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 使用带有DOMDocument的复杂xpath获取IMGSRC_Php_Xpath - Fatal编程技术网

Php 使用带有DOMDocument的复杂xpath获取IMGSRC

Php 使用带有DOMDocument的复杂xpath获取IMGSRC,php,xpath,Php,Xpath,我想要一个函数来返回图像的src。图像应由xpath选择,xpath应传递给函数: function getImgUrl($html, $xpath) { $xpathkram = new DOMXPath(@DOMDocument::loadHTML($html)); $src = $xpathkram->evaluate('string(' . $xpath . '@src)'); return $src; } $xpath = '//*[@id="watc

我想要一个函数来返回图像的src。图像应由xpath选择,xpath应传递给函数:

function getImgUrl($html, $xpath) {
    $xpathkram = new DOMXPath(@DOMDocument::loadHTML($html));

    $src = $xpathkram->evaluate('string(' . $xpath . '@src)');
    return $src; 
}
$xpath = '//*[@id="watch7-sidebar-modules"]/div[1]/div/div[2]/ul/li/div[2]/a/span/img';
$html = file_get_contents("https://www.youtube.com/watch?v=LNBjMRvOB5M";

echo getImgUrl($html, $xpath));

但由于某种原因,它拒绝工作,并在第四行声明了一个
DOMXPath::evaluate():无效表达式。

代码中有一些语法错误:
文件获取内容(“https://www.youtube.com/watch?v=LNBjMRvOB5M“;
和两个括号,而不是这里的一个
echo getImgUrl($html,$xpath));

首先将属性'src'作为'/@src'添加到$xpath查询中:

$xpath = '//*[@id="watch7-sidebar-modules"]/div[1]/div/div[2]/ul/li/div[2]/a/span/img/@src';
你的错误在这里:

$src = $xpathkram->evaluate('string(' . $xpath . '@src)');
你应写:

$src = $xpathkram->evaluate( $xpath );
结果是您收到的将是DOMNodeList对象。要从中获取文本,请执行以下操作:

$list = getImgUrl($html, $xpath);

foreach ($list as $item){
    var_dump($item->textContent);
}

我编辑代码是为了让我的问题更清楚。这些语法错误在这个过程中滑了进来。这修复了它,但是当xpath以/html/开头时它仍然不起作用。。示例:,
/html/body/main/article/section[3]/div/nav/a[2]/figure/picture/img/@src
尝试以“//”开始表达式,但不幸的是,这没有帮助。Stangely只有在使用某种类或id作为选择器(带括号)时,它似乎才起作用在你的例子中,无论你从什么符号开始表达——带点还是不带点。要获得结果,请使用以下表达式“//main/article/section[3]/div/nav/a[2]/figure/picture/source/source/img/@src”请参见