Xpoint
   [напомнить пароль]

LibXML, html и амперсанды в href ссылок

Метки: [без меток]
2012-11-28 09:34:08 [обр] Jared(0/26)[досье]

Понадобилось тут перелопатить кучу страшного ХТМЛ кода.
В качестве инструмента - ruby и LibXML.

Последний, встретив ссылку вида http://domain.tld/index.php?param=pampam&otherparam=taram, справедливо ругается и вылетает, встретив неизвестную сущность &otherparam, да еще и невалидно оформленную. При включении флага RECOVER вылетания прекращаются (хотя ругань остается даже при включенных флагах подавления сообщений об ошибках, но это другой вопрос), а парсер напрочь вырезает незнакомую сущность; и ссылка превращается в битую: http://domain.tld/index.php?param=pampam&=taram

Вопрос - можно ли как-то проинформировать парсер, что в recovery сущности вида '&otherparam' стоит воспринимать как '&otherparam'?

Сейчас, в качестве временной меры, перед парсингом подобные моменты заменяются на валидные регекспами, так как набор параметров известен. Но, это некошерно. И может сложиться ситуация, когда набор этих самых параметров будет неизвестен заранее, а выковыривать сотни их из исходного документа - сомнительное удовольствие.

спустя 1 час 34 минуты [обр] Lynn «Кофеман»(52/571)[досье]
Возьмите лучше какой-нибудь парсер HTML, например RubyTidy или Nokogiri.
И вообще гугл в помощь ruby html parser
спустя 2 дня 21 час [обр] Jared(0/26)[досье]
Lynn «Кофеман»[досье], спасибо, гляну.
спустя 10 дней [обр] Jared(0/26)[досье]

Lynn «Кофеман»[досье], к сожалению, найденные варианты не подошли.

Nokogiri, похоже, работает поверх LibXML (судя по требованиям тут: http://nokogiri.org/tutorials/installing_nokogiri.html). И, соответственно, также некорректно... то есть, конечно, корректно, но не так как нужно мне обрабатывает ссылки с двумя и больше параметрами.

Rubytidy такой вот у меня в предлагаемых гемах:

# gem list -r | grep rubytidy
rubytidy (1.0 java)

Попробовал TidyFFI (интерфейс к libtidy). Он вобще отказался жрать тот страшный HTML, с которым приходится работать - возвращает nil.

спустя 5 часов [обр] Marat Tanalin(0/78)[досье]
На крайний случай можно с помощью регулярного выражения заменять неэкранированные амперсанды (&) внутри значений атрибутов href на экранированные (&).
спустя 1 день 18 часов [обр] Jared(0/26)[досье]
Marat Tanalin[досье], сейчас так и делается. Но это костыль.
Powered by POEM™ Engine Copyright © 2002-2005