Невозможно получить данные таблицы со страницы HTML - PullRequest
1 голос
/ 08 июня 2011

Я пытаюсь получить некоторые поля данных в таблице на веб-странице HTML.Веб-страница динамически генерируется при публикации некоторого контента.Я использую php-curl для получения веб-страницы, а затем xpath для получения данных из некоторых полей.Я могу получить страницу, а не конкретные поля.Код выглядит следующим образом:

$url="http://www.rtu.ac.in/results/reformat.php";
$post="rollnumber=08epccs060&filename=fetchmodulesem_4_btech410m.php&button=Submit";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);

$totalPath="html/body/table[4]/tbody/tr[3]/td[4]";
$page=new DOMDocument();
$xpath=new DOMXPath($page);
$page->loadHTML($content);
$page->saveHTML();  // this shows the page contents

$total=$xpath->query($totalPath);
echo $total->length;    //shows 0
echo $total->item(0)->nodeValue;   //shows nothing

xpath правильно, как я проверил с помощью FirePath.Из этого я понимаю, что $xpath->query не выполняет работу.

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Вы пишете:

echo $total->length;    //shows 0

Это означает, что xpath вернул 0 элементов. Так что на самом деле он не делает то, что хотел бы.

//html/body/table[4]/tr[3]/td[4]

Или иначе проверьте синтаксис запроса xpath, что вы не допустили ошибку.

Кроме того, я сначала загрузил бы документ HTML, а затем инициализировал объект xpath.

$totalPath="//html/body/table[4]/tr[3]/td[4]";
$page=new DOMDocument();
$page->loadHTML($content);
$xpath=new DOMXPath($page);    
$total=$xpath->query($totalPath);

Редактировать: Удалено тело в соответствии с предложением Вриккена.

РЕДАКТИРОВАТЬ: Включить отчеты об ошибках вкл. предупреждения, чтобы вы могли убедиться, что а) HTML-код правильно загружен в DomDocument и б) если возникла проблема с XPath, вы его видите.


Должен бежать. Это мой код:

<?php

$url="http://www.rtu.ac.in/results/reformat.php";
$post="rollnumber=08epccs060&filename=fetchmodulesem_4_btech410m.php&button=Submit";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);

echo 'Size: ', strlen($content), "\n";
echo 'Beginning: ', substr($content, 0, 512), "\n\n";

$page=new DOMDocument();
$page->recover=false;
$page->loadHTML($content);

echo "\nLoaded XML:\n", $page->saveXML($page), "\n";


$xpath=new DOMXPath($page);
$totalPath="html/body/table[4]/tbody/tr[3]/td[4]";

$paths = array(
    '//body',
    '//body/table',
    '//body/table[4]',
    '//body/table[4]/tr',
    '//body/table[4]/tr[3]',
    '//body/table[4]/tr[3]/td',
    '//body/table[4]/tr[3]/td[4]',
    '//html/body/table[4]/tr[3]/td[4]',
);


foreach($paths as $path) {
    $result=$xpath->query($path);
    echo $path, ': ', $result->length, "\n";
}

И это вывод (вырезал верхний вывод, который был только для проверки загрузки):

//body: 1
//body/table: 4
//body/table[4]: 1
//body/table[4]/tr: 3
//body/table[4]/tr[3]: 1
//body/table[4]/tr[3]/td: 4
//body/table[4]/tr[3]/td[4]: 1
//html/body/table[4]/tr[3]/td[4]: 1

Всегда возвращает длину, означающую, что хотя бы есть узел.

1 голос
/ 08 июня 2011

Не глядя на HTML: /tbody не существует, а просто добавляется в Firefox. Удалите эту часть и получите здоровое недоверие к этому инструменту;)


редактировать

И действительно, порядок должен быть:

$page=new DOMDocument();
$page->loadHTML($content);
$xpath=new DOMXPath($page);

Поскольку DOMXpath делает снимки, он не отслеживает изменения DOM впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...