LINUX.ORG.RU

Mojo::DOM - делюсь граблями и ненавижу W3C.

 , ,


0

1

Делаю загрузчик кое-каких данных из веба. ВНЕЗАПНО после загрузки страницы в Mojo::DOM, все URL-ы со значком «&» (а это все имеющие для меня значение URL) рвутся в нечитаемую кашу.

Гугление продолжалось 4 часа, нашёл фразу:
«Actually, in ordinary HTML documents you have to use & in links to get it through the W3C Validator» - очевидно, дербан незаэскапленного «&» - это фича.

★★★★★

Парсинг веба xml-парсером — это дисциплина специальной олимпиады.

anonymous
()
Ответ на: комментарий от anonymous

Я использовал инструмент «Mojo::DOM - Minimalistic HTML/XML DOM parser with CSS selectors», который по-умолчанию рассматривает текст как HTML, а не XML. А ты чё-то сказанул и убежал.

Shadow ★★★★★
() автор топика

Ничё не понял. Это про то, что в HTML все «&» должны быть представлены, как

&
, но быдлокодеры сайтиков об этом не знали и напихали обычных «&»?

Olegymous ★★★
()
Последнее исправление: Olegymous (всего исправлений: 1)
Ответ на: комментарий от anonymous
$ua = Mojo::UserAgent->new;
$ua->transactor->name('Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; ru-RU)');

my $res1 = $ua->get($url)->res;
$dom = Mojo::DOM->new($res1->text);
@my_urls = $dom->find('div.class1 div.class2 ul li:nth-child(2)')->at('a')->attr('href')->each;

Собственно, массив @my_urls содержит сильно повреждённые данные в районе значков «&», если я в выводе ua перед передачей в парсер эскапю все «&», всё отлично.

Shadow ★★★★★
() автор топика
Ответ на: комментарий от Olegymous

Нет, я про разбор содержимого параметра href в теге a, где & в принципе не эскапится, с помощью популярного парсера, который ломается на валидном с точки зрения здравого смысла тексте.

Shadow ★★★★★
() автор топика
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от Olegymous

Да ЛЮБАЯ ссылка с передачей параметров!
Ты где GET заэскапленный видел???

Shadow ★★★★★
() автор топика
Ответ на: комментарий от Shadow

Так и не понял где проблема. Вот для примера берём и парсим эту страницу

use strict;
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new();
$ua->get('http://www.linux.org.ru/forum/web-development/10828728')->res->dom->find('div.reply a[itemprop="replyToUrl"]')->each(sub {
	print $_->attr('href'), "\n";
});

На выходе

add_comment.jsp?topic=10828728&replyto=10828736
add_comment.jsp?topic=10828728&replyto=10828756
add_comment.jsp?topic=10828728&replyto=10828767
add_comment.jsp?topic=10828728&replyto=10828785
add_comment.jsp?topic=10828728&replyto=10828787
add_comment.jsp?topic=10828728&replyto=10828792
add_comment.jsp?topic=10828728&replyto=10828794
add_comment.jsp?topic=10828728&replyto=10828795
add_comment.jsp?topic=10828728&replyto=10828797
add_comment.jsp?topic=10828728&replyto=10828799

Всё предельно корректно

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

У меня не работает :(
Видимо, из-за того, что windows. Короче, как закончу, буду искать баг.

Shadow ★★★★★
() автор топика
Ответ на: комментарий от Shadow

Да в интернетах пишут, что это скорее фича, чем баг.

тогда форкай

И я тут решил предупредить.

ок. спасибо

Bad_ptr ★★★★★
()
Ответ на: комментарий от Olegymous

Вырезает пару символов слева от &, справа от &, сам & и вместо этого ставит какой-то неизвестный значок. Видимо, это что-то с кодировками.

Shadow ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вообще в принципе, отсутствием некоторой «магии» при парсинге (результирующий DOM может отличаться), сохранением регистра, неймспейсами, правда чем же это всё мешает не очень понятно.

anonymous
()

А нельзя ли конкретный пример? Как то не испытывал трудности с парсингом урлов с «&» ранее. Например:

use Mojo::DOM;
my $dom = Mojo::DOM->new('<div><a href="http://test.ru/test&test">Tessstt</div>');
say $dom->at('a')->{href};
выдает ожидаемую строку
http://test.ru/test&test

kilolife ★★★★★
()
Ответ на: комментарий от Shadow

И зачем, кстати, повторно парсить $res1? ведь он уже несет в себе разобраный $res1->dom

kilolife ★★★★★
()
Ответ на: комментарий от Shadow

чтобы то, что я потом заливаю в постгрес, не заполняло память.

У тебя два одинаковых (почти) дома на выходе, просто они получены разными парсерами, причем тут память. Чтобы парсить инкрементально, нужно соответствующие пассы руками сделать, заюзать sax или похожую на питонячий finditer обертку найти.

bj
()

По ходу, strawberry perl как-то таки глючит, знак «&» в DOM разносит всё.

Shadow ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.