Call to undefined method DOMDocument::getElementsByClassName()
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) {
//...
}
user3305327
Updated on June 24, 2022Comments
-
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&node=4192584031&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=center-new-12&pf_rd_r=07C4YQ4KZ15MZJQBT2PD&pf_rd_t=701&pf_rd_p=736512207&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.