html — PHP DOM / xpath проверяет значение класса span элемента

В запросе curl у меня есть HTML-таблица, которая имеет структуру ниже. Теперь я хочу извлечь только те строки таблицы, которые содержат элемент span с пустым классом, а не строки с class = «subcomponent».
Я успешно попробовал Xpath найти элементы с пустым классом, но как мне получить все или даже более конкретные узлы, которые содержат Version и Partnumber.
Заранее спасибо.

<table>
...
<tbody>
<tr>
<td></td>
<td></td>
<td>
<span class="">Product</span>
</td>
<td>Version</td>
<td>Partnumber</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
<span class="subcomponent">Component</span>
</td>
<td>Version</td>
<td>Partnumber</td>
</tr>
</tbody>

Мой код PHP

$doc = new DOMdocument();
libxml_use_internal_errors(true);
$doc->loadHTML($page);
$doc->saveHTML();
$xpath = new DOMXpath($doc);
$query ='//span[@class=""]';
$entries = $xpath->query($query);

foreach ($entries as $entry) {
echo $entry->C14N();
}

0

Решение

Чтобы получить доступ к самим строкам таблицы с помощью SimpleXML, вы можете использовать следующее:

$sxml = simplexml_load_string('<table>...</table>');

$rows = $sxml->xpath('//tr[td/span[@class=""]]');

foreach ($rows as $row) {
echo "Version: ", $row->td[3], ", Partnumber: ", $row->td[4];
}

XPath работает, выбрав все <tr> теги, у которых есть ребенок <td>, который сам имеет ребенка <span> с пустым классом.

В цикле вам нужно получить доступ к дочерним ячейкам каждой строки по номеру, поскольку ваш образец не показывает, что они помечены каким-либо другим способом. Я предполагаю, что структура таблицы не будет меняться слишком часто, так что это должно быть хорошо.

Увидеть https://eval.in/860169 для примера.

Если вы выбираете полную веб-страницу, которая не обязательно будет правильно сформирована, вам, возможно, придется использовать DOMDocument как у вас в первом примере. Доступ к дочерним элементам немного менее понятен, но будет работать что-то вроде следующего:

$doc = new DOMdocument;
libxml_use_internal_errors(true);
$doc->loadHTML($page);
$xpath = new DOMXpath($doc);
$rows = $xpath->query('//tr[td/span[@class=""]]');

foreach ($rows as $row) {
$cells = $row->getElementsByTagName('td');

$version = $cells->item(3)->nodeValue;
$partNumber = $cells->item(4)->nodeValue;

echo "Version: {$version}, Part Number: {$partNumber}", PHP_EOL;
}

Увидеть https://eval.in/860217

2

Другие решения

Я бы использовал следующее выражение XPath:

//td[text()="Version"] | //td[text()="Partnumber"]

Что дает мне:

Element='<td>Version</td>'
Element='<td>Partnumber</td>'
Element='<td>Version</td>'
Element='<td>Partnumber</td>'
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector