Варианты парсинга HTML?

Я подумываю попробовать Beautiful Soup , пакет Python для парсинга HTML. Есть ли другие пакеты для очистки HTML, на которые мне следует обратить внимание? Python не является обязательным требованием, мне интересно услышать и о других языках.

История до сих пор:

Ответов (25)

Решение

Эквивалент Beautiful Soup в мире Ruby - это Hpricot от why_the_lucky_stiff .

Для Perl есть WWW :: Mechanize.

В Java вы можете использовать TagSoup .

Другой инструмент для .NET - MhtBuilder.

Почему еще никто не упомянул JSOUP для Java? http://jsoup.org/

Я знаю и люблю Screen-Scraper .

Screen-Scraper - это инструмент для извлечения данных с веб-сайтов. Screen-Scraper автоматизирует:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

Общее использование:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

Технические:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

Три редакции скребка:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.

Yahoo! Язык запросов или YQL можно использовать вместе с jQuery, AJAX, JSONP для очистки экрана от веб-страниц.

Сначала я бы узнал, предоставляют ли рассматриваемые сайты API-сервер или RSS-каналы для доступа к нужным вам данным.

Я использую Hpricot на Ruby. В качестве примера это фрагмент кода, который я использую для получения названий всех книг с шести страниц моей учетной записи HireThings (поскольку они, похоже, не предоставляют ни одной страницы с этой информацией):

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

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

Я обнаружил, что HTMLSQL - это смехотворно простой способ сканирования экрана. Чтобы добиться результата, нужны буквально минуты.

Запросы супер-интуитивно понятны - например:

SELECT title from img WHERE $class == 'userpic'

Теперь есть другие альтернативы, использующие тот же подход.

BeautifulSoup - отличный способ парсинга HTML. На предыдущей работе мне приходилось много копать, и мне жаль, что я не знал о BeautifulSoup, когда я начинал. Это похоже на DOM с гораздо большим количеством полезных опций и гораздо более питоническим. Если вы хотите попробовать Ruby, они портировали BeautifulSoup, назвав его RubyfulSoup, но он давно не обновлялся.

Другими полезными инструментами являются HTMLParser или sgmllib.SGMLParser, которые являются частью стандартной библиотеки Python. Они работают, вызывая методы каждый раз, когда вы вводите / выходите из тега и сталкиваетесь с текстом html. Они похожи на Expat, если вам это знакомо. Эти библиотеки особенно полезны, если вы собираетесь анализировать очень большие файлы и создание дерева DOM будет долгим и дорогостоящим.

В регулярных выражениях нет необходимости. BeautifulSoup обрабатывает регулярные выражения, поэтому, если вам нужны их возможности, вы можете использовать их там. Я рекомендую использовать BeautifulSoup, если вам не нужна скорость и меньший объем памяти. Если вы найдете лучший HTML-парсер на Python, дайте мне знать.

В мире .NET я рекомендую HTML Agility Pack. Не так просто, как некоторые из вышеперечисленных вариантов (например, HTMLSQL), но очень гибко. Он позволяет вам манипулировать плохо сформированным HTML, как если бы это был хорошо сформированный XML, поэтому вы можете использовать XPATH или просто выполнять итерацию по узлам.

http://www.codeplex.com/htmlagilitypack

Я использовал LWP и HTML :: TreeBuilder с Perl и нашел их очень полезными.

LWP (сокращение от libwww-perl) позволяет вам подключаться к веб-сайтам и очищать HTML, вы можете получить модуль здесь, а книга О'Рейли, похоже, находится здесь в сети .

TreeBuilder позволяет создавать дерево из HTML, а документация и исходный код доступны в HTML :: TreeBuilder - Parser, который строит дерево синтаксиса HTML .

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

Очистить Stack Overflow особенно легко с помощью Shoes и Hpricot .

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end

Я много использовал Beautiful Soup с Python. Это намного лучше, чем проверка регулярных выражений, потому что она работает как DOM , даже если HTML плохо отформатирован. Вы можете быстро найти HTML-теги и текст с более простым синтаксисом, чем регулярные выражения. Найдя элемент, вы можете перебирать его и его дочерние элементы, что более полезно для понимания содержимого в коде, чем с регулярными выражениями. Хотел бы я, чтобы Beautiful Soup существовал много лет назад, когда мне приходилось делать много снимков экрана - это сэкономило бы мне много времени и избавило бы меня от головной боли, поскольку структура HTML была настолько плохой, прежде чем люди начали ее проверять.

Другой вариант для Perl - это Web :: Scraper, основанный на Ruby's Scrapi . Короче говоря, с красивым и лаконичным синтаксисом вы можете получить надежный скребок прямо в структуры данных.

Хотя он был разработан для веб-тестирования .NET , я использовал для этой цели фреймворк WatiN . Поскольку он основан на модели DOM, довольно легко захватить HTML, текст или изображения. Недавно я использовал его, чтобы выгрузить список ссылок из запроса пространства имен MediaWiki All Pages в электронную таблицу Excel. Следующий фрагмент кода VB.NET довольно груб, но работает.


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub

У меня был некоторый успех с HtmlUnit на Java. Это простая структура для написания модульных тестов для веб-интерфейса, но не менее полезна для парсинга HTML.

Библиотека Python lxml действует как привязка Pythonic для библиотек libxml2 и libxslt. Мне особенно нравится его поддержка XPath и красивая распечатка XML-структуры в памяти. Он также поддерживает парсинг сломанного HTML. И я не думаю, что вы можете найти другие библиотеки / привязки Python, которые анализируют XML быстрее, чем lxml.

TemplateMaker утилита от Адриана Головатого (из Джанго славы) использует очень интересный подход: Вы кормите его вариацией одной и той же страницы , и он «узнает» , где «дыра» для переменных данных является. Он не специфичен для HTML, поэтому его также можно использовать для очистки любого другого текстового содержимого. Я использовал его также для PDF-файлов и HTML, преобразованных в обычный текст (с pdftotext и lynx соответственно).

«Simple HTML DOM Parser» - хороший вариант для PHP, если вы знакомы с селекторами jQuery или JavaScript, тогда вы почувствуете себя как дома.

Найдите здесь

Здесь также есть запись в блоге.

В Python есть несколько опций для парсинга HTML в дополнение к Beatiful Soup. Вот еще несколько:

  • механизировать : аналогично Perl WWW:Mechanize. Предоставляет вам объект, похожий на браузер, для взаимодействия с веб-страницами
  • lxml : привязка Python к libwww. Поддерживает различные варианты перемещения и выбора элементов (например, выбор XPath и CSS)
  • scrapemark : библиотека высокого уровня, использующая шаблоны для извлечения информации из HTML.
  • pyquery : позволяет создавать запросы в формате jQuery к XML-документам.
  • scrapy : высокоуровневый фреймворк для парсинга и веб-сканирования. Его можно использовать для написания пауков, для интеллектуального анализа данных, а также для мониторинга и автоматического тестирования.

Для тех, кто предпочитает графический инструмент рабочего процесса, RapidMiner (FOSS) предлагает удобное средство сканирования и очистки веб-страниц.

Вот серия видео:

http://vancouverdata.blogspot.com/2011/04/rapidminer-web-crawling-rapid-miner-web.html

Есть и это решение: netty HttpClient

Когда дело доходит до извлечения данных из HTML-документа на стороне сервера, Node.js - отличный вариант. Я успешно использовал его с двумя модулями под названием request и cheerio .

Вы можете увидеть пример того, как это работает здесь .