Дом и XPath соскоб - Что здесь не так? - PullRequest
0 голосов
/ 16 апреля 2011

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

$argos_html = file_get_html('http://www.argos.co.uk/static/Product/partNumber/9282197/Trail/searchtext%3EIPOD+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;

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

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

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

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-странице.

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

Ваш XPath в порядке, когда я использую его в Firefox, но он не будет работать с DOM, что неудивительно. Я предполагаю, что вы получили XPath от какого-то плагина браузера, способного вернуть путь для определенных элементов. Однако вы не должны доверять XPath, возвращаемым плагинами браузера, потому что браузеры изменят 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%3EIPOD+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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...