получение элемента src с использованием domDocument

Я использую domDocument. Я близок, но мне нужна помощь для последнего маленького

У меня есть этот html только фрагмент ниже. Существует несколько строк. Я пытаюсь получить href.

до сих пор я делаю следующее: я могу получить таблицу, tr и td в порядке, но не уверен, что делать дальше.

Спасибо за любую помощь

foreach ($dom->getElementsByTagName('table') as $tableitem) { if ( $tableitem->getAttribute('class') == 'tableStyle02'){ $rows = $tableitem->getElementsByTagName('tr'); foreach ($rows as $row){ $cols = $row->getElementsByTagName('td'); $hrefs = $cols->item(0)->getElementsByTagName('a'); } } } 

html-фрагмент:

 <table width="100%" border="0" cellspacing="0" cellpadding="2" class="tableStyle02"> <tr> <td><span class="Name"><a href="bin.php?cid=703&size=0"> <strong>Conference Facility</strong></a></span></td> <td align="center" nowrap>0.00</td> <td align="center">&nbsp;0&nbsp;</td> <td align="center">&nbsp;&nbsp;</td> <td align="center">&nbsp;0&nbsp;</td> <td align="center">&nbsp;0&nbsp;</td> <td align="center">&nbsp;0 - 0 &nbsp;</td> <td align="center">&nbsp;Wired Internet,&nbsp;&nbsp;&nbsp;</td> <td align="center">&nbsp;&nbsp;</td> </tr> 

Позвольте мне представить вам концепцию xpath, языка запросов для DomDocuments:

 //table[@class="tableStyle02"]//a/@href 

Читает как: Возьмите тег таблицы с атрибутом класса tableStyle02, а затем атрибутом href из дочернего тега.

Или как у вас был foreach для tr и td элементов:

 //table[@class="tableStyle02"]/tr/td/a/@href 

Теперь в этом пути тег a является прямым дочерним элементом тега td, который является прямым дочерним элементом тега tr, который является прямым дочерним элементом тега таблицы. Как вы можете видеть, с xpath гораздо проще сформулировать путь к элементу, чем писать все в PHP-коде.

По поводу PHP-кода, в PHP это может выглядеть так:

 $doc = new DOMDocument(); $doc->loadHTML($html); $xp = new DOMXPath($doc); $href = $xp->evaluate('string(//table[@class="tableStyle02"]//a/@href)'); 

Затем переменная $href содержит строку: bin.php?cid=703&size=0 .


Этот пример имеет строку ( string(...) ), поэтому ->evaluate возвращает строку, созданную с первого найденного узла атрибута. Вместо этого вы можете вернуть нодлист:

 $hrefs = $xp->query('//table[@class="tableStyle02"]/tr/td/span/a/@href'); # ^^^^^ ^^^^ 

Теперь $hrefs содержит обычный DOMNodeList , здесь он содержит все узлы атрибутов href:

 echo $hrefs->item(0)->nodeValue; # bin.php?cid=703&size=0 

Позаботьтесь о том, чтобы, если вы используете только одну косую черту / чтобы отделить теги, они должны быть прямыми детьми. С двумя косой чертой // это может быть потомок (ребенок или ребенок дочернего элемента (дочернего (из …))).

Вы должны иметь возможность использовать getAttribute () для отдельных экземпляров DOMElement (так же, как вы использовали его во второй строке примера):

 foreach ($hrefs as $a_node) { if ($a_node->hasAttribute('href')) { print $a_node->getAttribute('href'); } } 

Вам не нужно перемещаться по иерархии DOM, чтобы использовать getElementsByTagName :

 foreach ($dom->getElementsByTagName('table') as $tableitem) { if ($tableitem->getAttribute('class') == 'tableStyle02'){ $links = $tableitem->getElementsByTagName("a"); } } 

$links на данный момент теперь является DOMNodeList , поэтому вы можете перебирать его:

 foreach ($dom->getElementsByTagName('table') as $tableitem) { if ($tableitem->getAttribute('class') == 'tableStyle02'){ $links = $tableitem->getElementsByTagName("a"); $hrefs = array(); foreach ($links as $link) { $hrefs[] = $link->getAttribute("href"); } } } // Do things with $hrefs