DOM & XPath scraping - возвращает оба элемента li, когда вам нужен только один - PullRequest
1 голос
/ 22 апреля 2011

Вот мой код.

$dom_currys = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom_currys->loadHTMLFile('http://www.currys.co.uk/gbuk/apple-new-ipod-touch-8gb-4th-generation-07677427-pdt.html');
libxml_clear_errors();

$xpath_currys = new DOMXpath($dom_currys);
$nodes_currys = $xpath_currys->query(
    '/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li/span'
);
$currys_stock_data = $nodes_currys->item(0)->nodeValue; // "Available for home delivery"

echo $currys_stock_data;

При отражении возвращается с

 Available for home delivery
 Available to reserve & collect 

Мне требуется только часть "Доступно для доставки на дом".Каждый из них находится в отдельном элементе "li", но все же он возвращает оба, XPath, если бы я хотел, второй был бы

/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li[2]/span

Я подозреваю, что это связано с выбором правильного элемента, но не уверенесли это правильно или нет.

Также я требую, чтобы результат проверялся оператором IF.То, что у меня есть до сих пор:

if (strpos($currys_stock_data, 'Available for home') !== false) {
    $currys_stockyesno = "Yes";
} else {
    $currys_stockyesno = "No";
}
echo $currys_stockyesno;

Я подумал, что было бы лучше проверить, содержит ли оно «Доступно для доставки на дом», а не прямое совпадение, потому что веб-сайт иногда может сказать, что он доступен для доставки на дом2 дня по этим направлениям.Пока строка содержит эту строку, она будет возвращаться как true / yes.Но он говорит нет ...

Ответы [ 2 ]

0 голосов
/ 23 апреля 2011

Я изучил источник HTML и подтвердил, что

/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li

выбирает два элемента.

Если вы хотите выбрать только первый из двух текстовых узлов, используйте :

/html/body
      /div/div/div[2]
                /div/div/div[2]
                          /div/ul[2]/li[1]
                                      /span/following-sibling::text()
0 голосов
/ 22 апреля 2011

Я просмотрел сайт, который вы проверяете, и обнаружил, что li на самом деле содержит текст.У span есть класс для значка.Поскольку значок галочки меняется, нам нужно проверить и это.Тем не менее, похоже, что вам на самом деле не нужен текст, вам нужно проверить, позволяет ли товар доставить на дом.

$xpath = "//li[contains(., 'Available for home delivery')]/span[class='icon icon-check']";

Затем просто проверьте длину:

if( $nodes_currys->length === 1 ) // true if available for home.

Я должен также отметить, что этот метод не будет работать на их страницах поиска / просмотра, так как они используют изображения там ..... очень запутанно и почему я ненавижу чистку: P

...