2011-01-29 6 views
48

Каково текущее состояние библиотек для очистки веб-сайтов с помощью Haskell?Веб-скребок с Haskell

Я пытаюсь сделать себе больше своих быстрых задач в Haskell, чтобы помочь повысить уровень моего комфорта с помощью языка.

В Python я использую для этого отличную библиотеку PyQuery. Есть что-то подобное просто и легко в Haskell? Я просмотрел Tag Soup, и, хотя сам синтаксический анализатор кажется приятным, на самом деле перемещение страниц выглядит не так хорошо, как на других языках.

Есть ли лучший вариант там?

+1

Что вам не хватает в TagSoup? –

+1

Функции для поиска анализируемого документа выглядят более ограниченными, чем библиотеки на других языках. Функции общего назначения, такие как разделы, не кажутся такими плохими, но для некоторых действительно распространенных целей по-прежнему требуется несколько строк кода. Например, для выбора элемента по классу требуется, по крайней мере, несколько строк кода, чтобы сделать то, что будет одним вызовом в jquery. Это было бы неплохо для одного проекта, но мой типичный пример использования для этого - небольшой проект oneoff. Поэтому я либо поддерживаю некоторых помощников, либо повторяю себе кучу. Я что-то упускаю? – ricree

ответ

22

Из моего поиска в списках рассылки Haskell, похоже, что TagSoup является доминирующим выбором для синтаксического анализа страниц. Например: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

Что касается других аспектов вебов выскабливания (например, ползания, индексации и кэширования), я искал http://hackage.haskell.org/package/ для тех ключевых слов, но не нашел ничего многообещающего. Я даже просматривал пакеты с упоминанием «http», но ничего не выскочил на меня.

Примечание: Я не являюсь обычным Haskeller, поэтому надеюсь, что другие могут прослушивать, если я что-то пропустил.

+0

В Haskell XML Toolbox (HXT), возможно, стоит посмотреть: http://en.wikibooks.org/wiki/Haskell/XML –

+7

Я могу поручиться за TagSoup: я использовал его исключительно для проекта, который был полностью основан на очистке HTML , Что касается пакетов HTTP-клиентов, я написал [http-enumerator] (http://hackage.haskell.org/package/http-enumerator) специально, потому что я не видел никаких хороших альтернатив. –

+2

Существует скальпель, построенный на TagSoup https: // github.com/fimad/scalpel – guido

34

http://hackage.haskell.org/package/shpider

Shpider библиотека веб-автоматизации для Haskell. Это позволяет быстро писать сканеры и для простых случаев ( , как и следующие ссылки), даже без , читающих источник страницы.

Он имеет такие полезные функции, как включение относительных ссылок со страницы в абсолютных ссылок, опции для авторизации сделок только на данном домене, и возможности загружать только HTML документов.

Он также обеспечивает хороший синтаксис для заполнения .

Пример:

runShpider $ do 
     download "http://apage.com" 
     theForm : _ <- getFormsByAction "http://anotherpage.com" 
     sendForm $ fillOutForm theForm $ pairs $ do 
      "occupation" =: "unemployed Haskell programmer" 
      "location" =: "mother's house" 
+0

Интересно. Похоже, что shpider может использовать и для веб-тестирования. –

+0

Майкл, вы использовали его для тестирования? – Qrilka

+0

У меня возникли проблемы с установкой shpider на ghc 7.6.2 – Anton

11

Хотя я до сих пор для теперь новичка в Haskell, у меня есть твердое мнение, что HTML разбор в 2012 году должен быть сделан с помощью CSS селекторов, и, кажется, библиотек рекомендованные до сих пор не используют этот принцип.

Одним из возможных вариантов является HandsomeSoup, который построен на вершине HXT:

http://egonschiele.github.com/HandsomeSoup/

http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell

Эта страница о HXT, на котором основывается HandsomeSoup, также будет полезно (вы собираетесь нуждаться GetText или глубоко GetText):

http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

Но другой выбор дом-селектор:

http://hackage.haskell.org/package/dom-selector

Это сейчас альфа и его долгосрочное обслуживание может быть проблемой. Преимущество dom-selector заключается в том, что я не мог заставить символы Unicode работать с HandsomeSoup. Они работали из коробки с dom-селектором.

Этот вопрос связан с что: Is it possible to use Text or ByteString on HXT in Haskell?

дом-селектор на основе HTML-канала и XML-канала, для которого содержание кажется обеспеченной.

EDIT: Обратите внимание на мой новый ответ об анализе на основе объективов. Я оставил этот ответ, поскольку он по-прежнему хорош сам по себе, но теперь я бы предпочел использовать другой подход.

+1

HandsomeSoup - очень аккуратная библиотека. Спасибо, что поделились этим, или я бы не знал, где искать! – thegravian

6

Я уже написал еще один ответ на этот вопрос, предлагая синтаксический анализ на основе селекторов CSS, однако этот ответ теперь полтора года, и в настоящее время я думаю, что объективы могут быть лучшим подходом в haskell. Фактически вы получаете что-то вроде скомпилированных селекторов типа.

См. this reddit discussion для нескольких вариантов в этой вене. В случае, если ссылка исчезает, я копирую прямые ссылки:

Я не использовал ни один из тех, кто еще, но если бы я сегодня писал новый синтаксический анализ кода HTML, я бы определенно пошел на основе объектива.