#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. Я не говорил, что что-то недопустимо.