DOMXPath查询返回带有img标记的元素

时间:2013-10-16 21:36:22

标签: php html dom scrape domxpath

如何构建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>

4 个答案:

答案 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。