如何构建DOMXPath查询以返回DOMDocument上唯一img元素的src属性?
注意:对于具有多个img元素的DOMDoc,我能够成功使用 - > getElementsByTagName方法,但此方法对于仅包含一个img元素的DOMDoc返回空。请注意,我已经尝试人工添加img元素到doc。当元素成功添加时,随后调用getElementsByTagName只返回新添加的元素(包含多个img元素的文档,它们都返回很好,包括新添加的元素)。
此外,我尝试了以下代码,如类似页面上所建议的那样,但id不会回显任何内容:
$imageLink = $_POST['link'];
$external = new DOMDocument;
$external ->loadHTMLFile($imageLink);
$xpath = new DOMXPath($external);
$elements = $xpath->query("//*[@name='img']");
foreach ($elements as $node)
{
$element[] = $node;
echo $node->getAttribute('src');
}
print_r($node);
我也尝试通过重复使用 - > childNodes循环遍历所有节点并回显信息,但这也不起作用。我整天都花在这上面。如果有人可以告诉我具体如何刮取一个img元素的信息或以其他方式指导我一个可靠的PHP DOM教程,我将非常感激。
谢谢,
P.S。 当我输入诸如this之类的网址时,以下代码当前有效,但不包含仅包含一个图像的链接,例如this。我目前正在研究DOMXPath解决方案。感谢:
<?php
if(isset($_POST['link'])){
$link = $_POST['link'];
$scrapings = "";
$article = new DOMDocument;
$article ->loadHTMLFile($link);
$titles = $article->getElementsByTagName("title");
foreach($titles as $title){
echo $title->nodeValue, PHP_EOL;
}
$images = $article->getElementsByTagName("img");
foreach($images as $image){
$source = $image->getAttribute("src");
$scrapings .= '<img src="'.$source.'" alt="default">';
}
}
?>
<!DOCTYPE html>
<html>
<head></head>
<body>
<form method="POST" action="otherScraper.php">
<input type="text" name="link">
<input type="submit" value="submit">
</form>
<?php echo $scrapings; ?>
</body>
</html>
以上是上述代码的一个版本,但使用的是DOMXPath。完全相同的问题出现在它适用于大多数链接,但不包含单个img元素的链接。是关于如何设置文档的?:
<?php
if(isset($_POST['link'])){
$link = $_POST['link'];
$scrapings = "";
$article = new DOMDocument;
$article ->loadHTMLFile($link);
$xpath = new DOMXPath($article);
$imgs = $xpath->query('//img');
$titles = $article->getElementsByTagName("title");
foreach($titles as $title){
echo $title->nodeValue, PHP_EOL;
}
foreach($imgs as $image){
$source = $image->getAttribute("src");
$scrapings .= '<img src="'.$source.'" alt="default">';
}
}
?>
<!DOCTYPE html>
<html>
<head></head>
<body>
<form method="POST" action="image_scraper.php">
<input type="text" name="link">
<input type="submit" value="submit">
</form>
<?php echo $scrapings; ?>
</body>
</html>
答案 0 :(得分:1)
$imgs = $xpath->query('//img');
$src = $imgs->item(0)->getAttribute('src');
如果文档中有多个<img>
,那么就是一个简单的
foreach($imgs as $img) {
$src = $img->getAttribute('src');
}
会奏效。
答案 1 :(得分:0)
getElementsByTagName应该可以正常工作,您应该发布该代码,我们将尝试解决问题。
无论如何,您的xpath实际上是在搜索属性为name="img"
而不是img标记的任何标记,请改为使用
$elements = $xpath->query("//img");
答案 2 :(得分:0)
getElementsByTagName()
也适用于页面中的单个元素 - 返回包含一个元素的nodelist
:
header('Content-type: text/plain; charset=utf-8');
$html = <<< EOT
<html>
<body>
Image tag:
<img src="myimg1"/>
</body>
</html>
EOT;
$doc = DOMDocument::loadHTML($html);
$nodes = $doc->getElementsByTagName('img');
for($i=0; $i < $nodes->length; ++$i) {
$e = $nodes->item($i);
echo $e->nodeName, ' is ', $e->nodeType == 1 ? 'an Element' : 'something else but not an element', "\n";
if ($e->nodeType == 1) {
$src = $e->getAttribute('src');
echo "Tag has attribute '$src'\n";
}
}
这呈现
img is an Element
Tag has attribute 'myimg1'
确保您正在解析的HTML具有正确的结构。
答案 3 :(得分:0)
正如MUSA指出的那样,“DOMDoc只包含一个img元素”根本不是html文件,它们是图像的直接链接。因此不需要处理。我只是将用户提交的图像链接作为源我的新img元素和voi la。