Неверно сформированный запрос HTML и XPath - PullRequest
1 голос
/ 03 сентября 2011

У меня неправильный HTML-код, который я не могу изменить.Выполнение запроса XPath вообще не возвращает узлы:

$el = $xpath->query("//a[@class='product']/table"); // can get a tag with "//a[@class='product']"
print_r($el->length); // 0

Искаженный HTML:

<a class="product" href="#">
    <table width="385" cellspacing="0" cellpadding="5" style="border:1px; border-bottom-color:#E2E2E2; border-bottom-style:solid;">
        <tr>
            <td width="55">
                <img src="http://foobar.com:8080/img/1212.jpg" height="50" width="50">
            </td>
        <td width="195">Cod.27731<br>Product Name</td>
            <td width="60" align="center"><a href="?pageContent=items&price=fab&prodcod=27731">Details</a></td>
            <td width="80" nowrap>
                <div style="color:#FF0000;"><strong>$ 35.23</strong></div>
        </td>
        </tr>
    </table>
</a>

Я могу получить элемент, но не могу получить его дочерний элемент (таблица) ...

1 Ответ

0 голосов
/ 04 сентября 2011

Поскольку libxml изменит HTML-код, чтобы закрыть элемент a перед таблицей, вместо этого необходимо запросить таблицу follow-sibling , например,

$dom = new DOMDocument;
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$el = $xpath->query("//a[@class='product']/following-sibling::table");
echo $dom->saveHtml($el->item(0));

или переход от элемента

$dom = new DOMDocument;
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$table = $xpath->query("//a[@class='product']")->item(0)->nextSibling;
echo $dom->saveHtml($table);

Обратите внимание, что для передачи аргумента в saveHTML требуется как минимум PHP 5.3.6

...