【问题标题】:Call to undefined method DOMDocument::getElementsByClassName() [duplicate]调用未定义的方法 DOMDocument::getElementsByClassName() [重复]
【发布时间】:2016-01-31 05:11:03
【问题描述】:

我正在尝试从以下 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>

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

$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;

但我收到以下错误...

Call to undefined method DOMDocument::getElementsByClassName()

任何人都可以帮助我哪里出错了...因为我之前尝试过这个代码模式,但之前从未遇到过这样的问题。

【问题讨论】:

标签: php xml dom


【解决方案1】:

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

因此,要匹配 CSS 类属性,您必须了解它是如何工作的。 CSS 类是一个标记属性。它包含几个由空格分隔的类名。在 Xpath 中,这是一种可以将空格规范化为单个空格的方法。如果在类属性上使用它并在前后添加空格,则任何标记都匹配模式{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) {
  //...
}

【讨论】:

    【解决方案2】:

    DOMDocument 不包含方法 getElementsByClassName
    使用xpath

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

    【讨论】:

    • @cetver...感谢您的及时帮助,我没有使用 xpath...所以发现它很难处理...我正在使用以下代码,@$dom->loadHTML( $html2); $xpath = 新 DOMXpath($dom); $xpath->query('//div[contains(@class, "localImage")]'); $name = ''; foreach($xpath->getElementsByTagName('img') as $i) { $name = $i->getAttribute('alt'); } 回声 $name;但它给了我错误......你能帮帮我吗
    • 使用以下代码...我只得到 [div]...$xpath = new DOMXpath($dom); $elements = $xpath->query('//div[contains(@class, "localImage")]'); foreach ($elements as $element) { echo "
      [". $元素->节点名。 "]"; $nodes = $element->childNodes; foreach ($nodes as $node) { echo $node->nodeValue. "\n"; } }
    • @cetver...你能帮我写代码吗
    • 不要惊慌 ;) 这里是 sn-p ideone.com/L4WK7I
    • 匹配不够。 “类”是一个标记属性,因此它可以包含由任意数量的空格分隔的任意数量的类。一个简单的 contains() 也匹配部分类名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2018-07-28
    • 2020-09-19
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多