Я пытаюсь получить тег alt из следующего тега img …
<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://img.ruphp.com/php/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()
Может кто-нибудь, пожалуйста, помогите мне, где я ошибаюсь … поскольку я пробовал этот шаблон кода раньше, но никогда раньше не сталкивался с такой проблемой.
Класс DOMDocument не содержит метод getElementsByClassName
Использовать xpath
$xpath = new DOMXpath($dom); $xpath->query('//div[contains(@class, "localImage")]'); //instance of DOMNodeList
Этот метод не поддерживается PHP DOMDocument. Он может быть эмулирован Xpath. Любой селектор CSS3, который не возвращает псевдоэлементы, может быть преобразован в выражение Xpath.
Поэтому, чтобы соответствовать атрибуту класса CSS, вы должны понимать, как он работает. Класс CSS является атрибутом токена. Он содержит несколько имен классов, разделенных пробелами. В Xpath здесь есть метод, который может нормализовать пробелы в одиночные пробелы. Если использовать атрибут класса и добавить пробел к фронту и обратно, любой токен будет соответствовать шаблону {space}ClassOne{space}
. С несколькими токенами вы получите что-то вроде {space}ClassOne{space}ClassTwo{space}ClassThree{space}
. Часть импорта, которая содержит Class
но не {space}Class{space}
.
Селектор CSS .className
может быть преобразован в выражение .//*[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) { //... }