Попытка прочитать значение в xpath

#html #xml #perl #xpath

#HTML #xml #perl #xpath

Вопрос:

Я пытаюсь получить значение школьного округа, указанного на этом веб-сайте: http://gis.nyc.gov/dcp/at/f1.jsp?submit=trueamp;house_nbr=310amp;street_name=Lenox Avenueamp;boro=1

Я использовал Firebug, чтобы получить XPath этого значения: /html/body/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/table/tbody/tr[10]/td[2]

И хотел бы прочитать его с помощью Perl. Я написал следующий код:

 #!/usr/bin/perl -w

use HTML::TreeBuilder::XPath;
use Data::Dumper;

my $tree= HTML::TreeBuilder::XPath->new;

$tree->parse_file("test.html");

my @nb=$tree->findvalue( '/html/body/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/table/tbody/tr[10]/td[2]');

print Dumper(@nb);
  

Но он просто возвращается $VAR1 = ''; .

Любые предложения. Чтобы запустить это, я просто скопировал исходный код с веб-страницы в test.html .

Спасибо!

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

1. Какой браузер вы используете? Для тестирования, я вижу, вы использовали firefox для получения xpath? Internet Explorer интерпретирует XPath по-другому (по крайней мере, раньше) FF td [2] = IE td [1] . M $ решил начать с индекса 0.

2. @Cromat Я использовал Firefox, но будет ли это иметь значение? Разве не имеет значения, какой HTML ::TreeBuilder ::XPath использует, а не браузер, который я использовал для получения HTML?

3. Не могу ответить, поскольку я не использую PERL, но я могу сказать вам, что HTML не является допустимым XML, и нет ничего, что указывало бы, что это XHTML.

4. @Ted Johnson, никто не сказал, что это XML или XHTML, так что я не понимаю вашу точку зрения.

Ответ №1:

Начальный тег некоторых элементов HTML (HTML, HEAD, BODY и TBODY) не является обязательным. Взгляните на

 ...<table><tr><td>Foo</td></tr></table>...
  

Согласно HTML, этот фрагмент содержит четыре элемента:

 TABLE
   TBODY
      TR
         TD
  

Firefox создает все четыре элемента, поэтому он выдает следующий xpath для элемента TD:

 .../table/tbody/tr/td
  

HTML::TreeBuilder, вероятно, не создает элементы, если их начальные теги опущены, поэтому он создает только три элемента для этого фрагмента:

 TABLE
   TR
      TD
  

Вам нужно будет использовать следующий xpath, чтобы найти элемент TD:

 .../table/tr/td
  

Бьюсь об заклад, вы найдете результаты, если удалите tbody тесты из своего xpath, поскольку элементы TBODY, скорее всего, не найдены в файле.

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

1. TBODY является допустимым XML, а tr вложен в XML-элемент TBODY.

2. @ikegami Есть какие-либо рекомендации по чтению файла непосредственно с URL-адреса вместо того, чтобы сохранять его в файл?

3. @Джефф Эриксон, ->new_from_content

4. @Джефф Эриксон, если вы используете ->parse , не забудьте позвонить ->eof .

5. @Тед Джонсон, о чем ты говоришь? 1. Мы говорим о HTML, а не XML. 2. Я не говорил, что что-то недопустимо.