2012-06-06 4 views
1

Я хотел бы разработать «загрузчик страниц» в рубине - то, что с учетом URL-адреса загрузит html, связанные css, файлы изображений и javascripts, а затем измените html, чтобы ссылаться на локальные копии вместо удаленных. Так же, как некоторые браузеры делают с опцией «сохранить как полную страницу».«Сохранить страницу с зависимостями» (с помощью Nokogiri?)

Я думал об использовании Nokogiri для первоначального анализа страницы. Но я не уверен, что это лучший инструмент для работы:

  • Может ли он получить список внешних зависимостей (стилей, изображений и javascripts). Я не забочусь о зависимых от javascript зависимостях.
  • Разделяет ли он CSS? Возможно, я захочу загрузить изображения или @imported css-файлы.

Есть ли драгоценный камень, который уже делает то, что я хочу?

+0

Связанный (но не идентичный) вопрос: http://stackoverflow.com/questions/1080565/rails-emulate-save-page-as-behaviour – kikito

+0

Вы можете попробовать с помощью рамки тестирования, управляющей веб-браузером, например. Selenium WebDriver + любой обычный браузер или HtmlUnit (браузер без браузера). Возможно, это будет немного тяжело для того, о чем вы просили. – echristopherson

ответ

0

Кажется, что я хотел, уже не реализован. Nokogiri можно использовать для анализа html, и есть другие драгоценности, которые могут анализировать CSS (например, css_parser), но я лично их не использовал, и у них, вероятно, будут проблемы с современными css (медиа-запросы, импорт и т. Д.).

1
  1. Нет, Nokogiri не знает о внешних зависимостях. Вы можете сделать что-то вроде:

    js_urls = doc.xpath('//script/@src').map(&:content) 
    css_urls = doc.xpath('//link/@href').map(&:content) 
    img_urls = doc.xpath('//img/@src').map(&:content) 
    

    & hellip; но это не найти:

    • скрипты или CSS загружаются динамически JavaScript (создания элементов и добавления их в документ)
      который вы говорите что вам не все равно
    • изображения, запрошенные на JavaScript, например var img = new Image; img.src="...";
      , о котором вы говорите, что вам не все равно
    • CSS, связанный с CSS, например. @import url(foo.css);
    • Изображения, на которые ссылается CSS, например. #nav { background:url(/images/navhead.png) }
       

    Кроме того, все URL, вы получите обратно, может быть относительно текущего URL, так что вам нужно будет resolve relative URLs.

  2. Нет, Nokogiri - это библиотека DOM X/HTML (стоящая поверх libxml2). Он не анализирует JavaScript, он не выполняет JavaScript, он не анализирует CSS и не может применять CSS к странице. Это не веб-браузер.

+0

Да. Я сейчас двигаюсь. – echristopherson

Смежные вопросы