调用未定义的方法DOMDocument :: getElementsByClassName()

use*_*327 1 php xml dom

我正在尝试从以下img标签中获取alt标签...

<div class="localImage">

    <a href="/Electronic-Deals/b/ref=amb_link_185249707_2?ie=UTF8&amp;node=4192584031&amp;pf_rd_m=A1VBAL9TL5WCBF&amp;pf_rd_s=center-new-12&amp;pf_rd_r=07C4YQ4KZ15MZJQBT2PD&amp;pf_rd_t=701&amp;pf_rd_p=736512207&amp;pf_rd_i=20">

    <img src="http://g-ecx.images-amazon.com/images/G/31/rcx-events/cat-navs-electronics1._V335880105_.png" alt="Electronics" border="0" height="140" width="170"></a>

    </div>
Run Code Online (Sandbox Code Playgroud)

为此,我尝试了以下代码...

$dom = new DOMDocument();

@$dom->loadHTML($html2);

  foreach($dom->getElementsByClassName("localImage") as $tr) {

$name = '';

foreach($tr->getElementsByTagName('img') as $i)
{
$name = $i->getAttribute('alt');
}
echo $name;
Run Code Online (Sandbox Code Playgroud)

但是出现以下错误...

Call to undefined method DOMDocument::getElementsByClassName()
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决哪里出错了...因为我之前尝试过这种代码模式,但从未遇到过此类问题。

cet*_*ver 5

DOMDocument类不包含getElementsByClassName
使用xpath的方法

$xpath = new DOMXpath($dom);
$xpath->query('//div[contains(@class, "localImage")]'); //instance of DOMNodeList
Run Code Online (Sandbox Code Playgroud)


ThW*_*ThW 5

PHP的DOMDocument不支持该方法。Xpath可以模拟它。任何不返回伪元素的CSS3选择器都可以转换为Xpath表达式。

因此,要匹配CSS类属性,您必须了解其工作方式。CSS类是令牌属性。它包含几个用空格分隔的类名。在Xpath中,这是一种可以将空格标准化为单个空格的方法。如果在class属性上使用它,并在前面和后面添加一个空格,则任何与该模式匹配的标记{space}ClassOne{space}。使用几个令牌,您最终会得到类似的信息{space}ClassOne{space}ClassTwo{space}ClassThree{space}。确实包含Class但不包含的导入部分{space}Class{space}

CSS选择器.className可以转换为Xpath表达式.//*[contains(concat(" ", normalize-space(@class), " "), " className ")]。第一部分对属性进行规范化,以便它与令牌匹配,而不仅与可能是令牌名称一部分的字符串匹配。

在您的情况下,您可以优化以匹配div元素:

.//div[contains(concat(" ", normalize-space(@class), " "), " localImage ")]

要使用Xpath,您需要为文档创建一个DOMXpath实例。

$document = new DOMDocument();
$document->loadHTML($html2);
$xpath = new DOMXpath($document);

$expression = './/div[contains(concat(" ", normalize-space(@class), " "), " localImage ")]';
foreach ($xpath->evaluate($expression) as $div) {
  //...
}
Run Code Online (Sandbox Code Playgroud)