Call to undefined method DOMDocument::getElementsByClassName()

19,112

Solution 1

Class DOMDocument does not contains method getElementsByClassName
Use xpath

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

Solution 2

The method is not supported by PHPs DOMDocument. It can be emulated by Xpath. Any CSS3 selector that does not return pseudo elements can be converted into an Xpath expression.

So to match a CSS class attribute you have to understand how it works. A CSS class is a token attribute. It contains several class names separated by whitespaces. In Xpath here is a method that can normalize the whitespaces to single spaces. If use that on a class attribute and add a space to the front and back any token matches the pattern {space}ClassOne{space}. With several tokens you would end up with something like {space}ClassOne{space}ClassTwo{space}ClassThree{space}. The important part is that does contain Class but not {space}Class{space}.

The CSS selector .className can be converted into to the Xpath expression .//*[contains(concat(" ", normalize-space(@class), " "), " className ")]. The first part normalizes the attribute so that it matches the token and not just the string that could be part of a token name.

In your case you can refine that to match div elements:

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

To use Xpath you need to create an DOMXpath instance for the document.

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

$expression = './/div[contains(concat(" ", normalize-space(@class), " "), " localImage ")]';
foreach ($xpath->evaluate($expression) as $div) {
  //...
}
Share:
19,112
user3305327
Author by

user3305327

Updated on June 24, 2022

Comments

  • user3305327
    user3305327 almost 2 years

    I am trying to fetch the alt tag from the following img tag...

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

    For this I have tried the following code...

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

    But am getting the following error...

    Call to undefined method DOMDocument::getElementsByClassName()
    

    Can anyone please help me where am getting it wrong...as I have tried this code pattern earlier but never faced such issue earlier.