4

我试图在这里关注一些关于 preg_match 和 DOM 的问题,但一切都在我脑海中浮现。

我有一个这样的字符串:

$string = '<td class="borderClass" width="225" style="border-width: 0 1px 0 0;" valign="top">
<div style="text-align: center;">
    <a href="http://myanimelist.net/anime/10800/Chihayafuru/pic&pid=35749">
    <img src="http://cdn.myanimelist.net/images/anime/3/35749.jpg" alt="Chihayafuru" align="center">
    </a>
</div>';

我现在正试图从中获取图像 src 属性值。我尝试使用此代码,但我无法弄清楚我做错了什么。

$doc = new DOMDocument();
$dom->loadXML( $string );
$imgs = $dom->query("//img");
for ($i=0; $i < $imgs->length; $i++) {
    $img = $imgs->item($i);
    $src = $img->getAttribute("src");
}
$scraped_img = $src;

如何使用 php 从中获取图像 src 属性?

4

3 回答 3

6

这是更正后的代码,您可以使用:

$string = '<td class="borderClass" width="225" style="border-width: 0 1px 0 0;" valign="top">
<div style="text-align: center;">
    <a href="http://myanimelist.net/anime/10800/Chihayafuru/pic&pid=35749">
    <img src="http://cdn.myanimelist.net/images/anime/3/35749.jpg" alt="Chihayafuru" align="center">
    </a>
</div>';

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML( $string );
$xpath = new DOMXPath($doc);
$imgs = $xpath->query("//img");
for ($i=0; $i < $imgs->length; $i++) {
    $img = $imgs->item($i);
    $src = $img->getAttribute("src");
}

echo $src;

输出

http://cdn.myanimelist.net/images/anime/3/35749.jpg
于 2013-10-11T18:13:34.507 回答
2

我们在编写 Drupal 时发现使用 SimpleXML 比处理 DOM 容易得多:

$htmlDom = new \DOMDocument();
@$htmlDom->loadHTML('<?xml encoding="UTF-8">' . $string);
$elements = simplexml_import_dom($htmlDom);
print $elements->body->td[0]->div[0]->a[0]->img[0]['src'];

这允许您加载任何 HTML 汤,因为 DOM 比 simplexml 更宽容,同时允许使用简单而强大的 simplexml 扩展。

前三行是从 Drupal 测试框架中逐字复制出来的——它是真正经过战斗强化的代码。

于 2013-10-11T18:15:31.987 回答
0
    $html = '<td class="borderClass" width="225" style="border-width: 0 1px 0 0;" valign="top">
<div style="text-align: center;">
    <a href="http://myanimelist.net/anime/10800/Chihayafuru/pic&pid=35749">
    <img src="http://cdn.myanimelist.net/images/anime/3/35749.jpg" alt="Chihayafuru" align="center">
    </a>
</div>';

    $dom = new DOMDocument();
    $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    libxml_use_internal_errors(FALSE);
    $xpath = new DOMXPath($dom);
    /** @var \DOMNodeList $images_dom_list */
    $images_dom_list = $xpath->query('//img');
    /** @var \DOMElement $image_dom_element */
    foreach ($images_dom_list as $image_dom_element) {
      $src = $image_dom_element->getAttribute('src');
      // Do what you want.
      $src = '//google.com/image.jpg';
      $image_dom_element->setAttribute('src', $src);
    }

    $updated_html_string = $xpath->document->saveHTML();
于 2020-05-17T13:54:30.197 回答