Очистка Dom и XPath — что здесь не так?

#php #dom #xpath

#php #dom #xpath

Вопрос:

Мне нужно очистить фрагмент текста с веб-страницы из Интернета, я использую dom и xpath для поиска данных, однако, похоже, я не могу выбрать точную информацию, которая мне нужна. Пока что вот мой код, проблема в разделе item (0)-> nodeValue — это работает для других моих настроек, которые у меня есть для другой страницы, но не для этой.

 $argos_html = file_get_html('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext>IPOD TOUCH.htm');

$dom_argos= new DOMDocument();
$dom_argos->loadHTML($argos_html);

$xpath_argos = new DOMXpath($dom_argos);

$expr_currys = "/html/body/div[4]/div[3]/form/div[2]/div/div[5]/ul/li[3]/span";
$nodes_argos = $xpath_argos->query($expr_argos);

$argos_stock_data = $nodes_argos->item(0)->nodeValue;
  

Кто-нибудь может показать мне, где я ошибаюсь? поскольку я всегда получаю ошибку, которая относится к части -> item(0)-> nodeValue; однако, если я прокомментирую это, ошибки не будет, но данные вообще не будут собраны…

Возможно, это должно быть просто -> nodeValue;

Я понимаю, что это может быть связано со структурами страниц, но я новичок во всем этом! Спасибо

Комментарии:

1. Вероятно, ошибка связана с тем, что у вас не выбраны элементы: вы не можете вызвать nodeValue , когда нет узла! Вероятно, у вас ошибка в вашем XPath — он ужасно сложный, поэтому я не удивлен. Посмотрите, можете ли вы найти более простой способ указать, какой элемент вы хотите. Идентификаторы элементов были бы хорошим началом.

2. Если вы получаете сообщение об ошибке, сообщите нам, что это. Возможно, для вас это ничего не значит, но, вероятно, что-то значит для кого-то на этом форуме.

Ответ №1:

Запуская ваш код, я сначала получаю :

 Notice: Undefined variable: expr_argos
Warning: DOMXPath::query() [domxpath.query]: Invalid expression
  

Итак, прежде всего, убедитесь, что вы используете что-то допустимое для вашего запроса XPath — например, у вас должно быть это :

 $nodes_argos = $xpath_argos->query($expr_currys);
  

вместо того, что у вас сейчас есть :

 $nodes_argos = $xpath_argos->query($expr_argos);
  

Затем вы получаете следующую ошибку :

 Notice: Trying to get property of non-object
  

в следующей строке :

 $argos_stock_data = $nodes_argos->item(0)->nodeValue;
  

По сути, это означает, что вы пытаетесь прочитать свойство nodeValue для чего-то, что не является объектом : $nodes_argos->item(0);

Я предполагаю, что ваш запрос XPath недействителен; таким образом, вызов xpath() метода не возвращает ничего интересного.

Вам следует проверить свой (слишком длинный, чтобы его было легко понять) запрос XPath, убедившись, что он соответствует чему-то на вашей HTML-странице.

Комментарии:

1. Приветствую ваш ответ, о нет, это я снова копирую и вставляю, вот почему там каррис, все должно было быть argos. У меня есть несколько интернет-магазинов, которые я пытаюсь наскрести. Спасибо за ваше объяснение, я собираюсь продолжить и написать еще немного кода!

Ответ №2:

Ваш XPath работает нормально, когда я использую его в Firefox, но он не будет работать с DOM, что неудивительно. Я предполагаю, что вы получили свой XPath из какого-то плагина для браузера, способного возвращать путь для определенных элементов. Однако вам не следует доверять XPaths, возвращаемым плагинами браузера, потому что браузеры будут изменять DOM с помощью JavaScript и добавлять подразумеваемые значения там, где это необходимо. Вместо этого используйте необработанный исходный код.

Ваш XPath оценивается как «Доставка на дом в течение 2 дней» в Firefox, чего я не ожидал бы от переменной с именем «stock_data». Но в любом случае, это должно сработать:

 $dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->loadHTMLFile('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext>IPOD TOUCH.htm');
libxml_clear_errors();

$xpath = new DOMXpath($dom);
$nodes = $xpath->query(
    '/html/body//div[@id="deliveryInformation"]/ul/li[@class="home"]/span'
);
echo $nodes->item(0)->nodeValue; // "Home delivery within 2 days"
  

Комментарии:

1. Вы правы, я использовал плагин! а также переменные, которые я забыл изменить на argos, currys — еще один из розничных продавцов, от которых я пытаюсь получить данные. Также мне нужен метод проверки наличия товара на складе, поэтому я подумал, как бы розничный торговец сообщил на своем веб-сайте, есть ли товар на складе, и проверил это с помощью оператора IF, поэтому, если окончательная проверка не содержала «доставка на дом ….», тогда она вернет значение false / not in stock! Я очень новичок во всем этом и взялся за сложный проект! в любом случае, очень признателен за ваш ответ, теперь перейдем к кодированию!

2. @James пожалуйста, просмотрите ответы, которые вам были даны до сих пор, и либо примите тот, который решил вашу проблему, либо обновите и улучшите свой вопрос, чтобы указать, почему ни один из них не решает вашу проблему, чтобы у людей был шанс улучшить свои ответы. Спасибо.