Захват элементов узла с помощью DOMXpath
Я делаю анализ с использованием DOMDocument и DOMXpath и могу только частично получить данные, и я не уверен, что я делаю неправильно.
HTML выглядит так:
<script src="/MercuryGate/util/validate.js" type="text/javascript"></script>
<html>
<head>
<title>Title</title>
<script language="javascript" type="text/javascript" src="../util/popup_window.js"> </script>
</head>
<body background="white" style="margin: 0 0 0 0; padding: 0 0 0 0;">
<form onSubmit="return false;">
<table cellpadding="0" cellspacing="1" class="bids">
<tr>
<td class="headerTD">
Respond By
</td>
<td class="headerTD">
Load
</td>
<td class="headerTD">
Origin
</td>
<td class="headerTD">
State
</td>
<td class="headerTD">
Pickup Range
</td>
</tr>
<tr>
<td class="oddTD">Data1</td>
<td class="oddTD"><a href="xxx">2568103S</a></td>
<td class="oddTD">Data3</td>
<td class="oddTD">WA</td>
<td class="oddTD">Data4</td>
</tr>
<input type="hidden" id="xxxxx" name="xxxx" value="false" />
<tr>
<td class="evenTD">Data1</td>
<td class="evenTD"><a href="xxx">2568103S</a></td>
<td class="evenTD">Data3</td>
<td class="evenTD">WA</td>
<td class="evenTD">Data4</td>
</tr>
<input type="hidden" id="xxxx" name="xxxx" value="false" />
</table>
<br>
<input type="button" value=" Refresh " onclick="refresh()" style="font-size: 8pt; font-family: Arial;">
</form>
Мой скрипт после скребка выглядит так
$dom = new DOMDocument('1.1');
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTML(strtolower($html));
$xpath = new DOMXPath($dom);
$trNodes = $xpath->query("//table/tr");
$counter = -1;
foreach ($trNodes as $tr) {
$counter++;
$tdNodes = $xpath->query(".//td[contains(concat(' ',normalize-space(@class),' '),' oddTD ')]", $tr);
print_r($tdNodes);
}
На print_r($tdNodes);
Я получаю 0 во всех итерациях. Я не знаю почему. Может кто-нибудь заметить ошибку в моих запросах xpath?
2 ответа
Я нашел свою проблему... так как я делаю $dom->loadHTML(strtolower($html));
это не будет соответствовать
$tdNodes = $xpath->query(".//td[contains(concat(' ',normalize-space(@class),' '),' oddTD ')]", $tr);
но
$tdNodes = $xpath->query(".//td[contains(concat(' ',normalize-space(@class),' '),' oddtd ')]", $tr);
Если вам нужны только теги td для каждого tr, это поможет:
foreach ($trNodes as $tr) {
$tdNodes = $xpath->query('.//td[contains(@class, "headerTD")]', $tr);
print_r($tdNodes);
}
Вы также можете вставить //text()
в запросе XPath, если вы хотите, чтобы содержимое каждого тд.