Ловушки Perl
Истории-страшилки про Perl-программиста, с подсказками и разоблачениями
Главная
О блоге
Об авторах
Почему?
rss
@perltrapcom
Программисту понадобилась классификация слов и понятий, и он решил использовать Википедию как источник категорий. Разбирать ответ API Википедии предполагалось вот такой функцией:
use XML::LibXML::XPathContext;
use XML::LibXML;
=head2 parse_wikipedia_categories_xml
Получает на вход скаляр -- xml, полученный из API Википедии
Пример:
http://en.wikipedia.org/w/api.php?action=query&prop=categories&titles=XML&format=xml&cllimit=100
<?xml version="1.0"?>
<api>
<query>
<pages>
<page pageid="34138" ns="0" title="XML">
<categories>
<cl ns="14" title="Category:All articles containing potentially dated statements" />
<cl ns="14" title="Category:Application layer protocols" />
<cl ns="14" title="Category:Articles containing potentially dated statements from 2009" />
...
</categories>
</page>
</pages>
</query>
</api>
Результат был бы
[
'Category:All articles containing potentially dated statements',
'Category:Application layer protocols',
'Category:Articles containing potentially dated statements from 2009',
...
]
=cut
sub parse_wikipedia_categories_xml
{
my $xml = shift;
my $xml_doc = XML::LibXML->new()->parse_string($doc);
my $xc = XML::LibXML::XPathContext->new($xml_doc);
return [ map {$_->to_literal} @{$xc->find("/api/query/pages/page/categories/cl/@title")}];
}
Но что-то здесь не так… Что?