Как справиться с проблемами целостности данных с domdocument? - PullRequest
1 голос
/ 06 сентября 2011

Учитывая последовательность элементов вида

<td class="name">Product Name</td>
<td class="price">$10.00</td>

, можно использовать domdocument () для анализа страницы, содержащей, скажем, 100 пар имя / цена в группу из 100 имен и отдельную группу из100 цен.Однако, если одна из цен отсутствует, вы получаете группу из 100 имен и группу из 99 цен, и неясно, какой продукт не имеет свою цену.

Использование регулярного выражения для анализа пар имени/ Данные о цене (делая цену необязательной) позволяют определить, какому товару не хватает цены, в результате получается 100 пар, одна из которых имеет пустое значение цены.Есть ли какой-нибудь способ добиться этого с помощью domdocument (), так что нет необходимости использовать регулярное выражение для анализа html?

РЕДАКТИРОВАТЬ: я попробовал предложение dqhendricks, но я получаю синтаксическую ошибку в цикле foreachследующие

<?php

$html = <<<EOT

<table>
    <tr>
       <td class="productname">a</td>
       <td class="price">1</td>
    </tr>

    <tr>
       <td class="productname">b</td>
       <td class="price">2</td>
    </tr>

    <tr>
       <td class="productname">c</td>
       <td class="price">3</td>
    </tr>

    <tr>
       <td class="productname">d</td>
       <td class="price">4</td>
    </tr>

    <tr>
       <td class="productname">e</td>
       <td class="price">5</td>
    </tr>
</table>

EOT;

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//table/tr/') as $node) {
    $name = $node->query('td[@class="productname"]');
    $price= $node->query('td[@class="price"]');
}

print_r($node);

?>

1 Ответ

1 голос
/ 06 сентября 2011

с этой структурой, не будете ли вы перебирать элементы td и проверять их атрибуты класса?и если в строке два атрибута имени, вы знаете, что в первом не указана цена?

где ваш код анализа?Я думаю, что проблема там.Вы просто используете xpath, чтобы получить список продуктов и список цен или как?

сейчас, если ваш html-документ структурирован так:

<tr>
   <td class="productname">x</td>
   <td class="price">x</td>
</tr>

, вы захотите выполнить итерациюэлементы tr и проверьте их содержимое, и вы легко узнаете, по каким продуктам не хватает цены.

РЕДАКТИРОВАТЬ:

 foreach ($xpath->query('//table/tr/') as $node) {
    $name = $node->query('td[@class="name"]');
    $price= $node->query('td[@class="price"]');
 }

Что-то подобное в любом случае ...

...