Варианты соскоба HTML?

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

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

40 ответов

Решение

Рубиновым эквивалентом Beautiful Soup в мире является Hpricot Why_the_lucky_stiff.

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

http://www.codeplex.com/htmlagilitypack

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

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

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

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

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

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

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

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

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

В Python есть несколько вариантов очистки HTML в дополнение к Beatiful Soup. Вот некоторые другие:

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

"Простой HTML DOM Parser" - хороший вариант для PHP, если вы знакомы с jQuery или JavaScript-селекторами, вы окажетесь дома.

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

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

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

Утилита создания шаблонов от Adrian Holovaty (известная как Django) использует очень интересный подход: вы передаете ей варианты одной и той же страницы, и она "узнает", где находятся "дыры" для переменных данных. Это не специфично для HTML, поэтому было бы неплохо также удалить любой другой текст в открытом виде. Я использовал его также для PDF и HTML, преобразованных в обычный текст (с pdftotext и lynx, соответственно).

Я знаю и люблю 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.

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

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

Соскоб стек переполнение особенно легко с обувь и Hpricot.

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackru.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackru", :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

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

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

Еще одним инструментом для.NET является MhtBuilder

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

Я использую 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 

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

Хотя он был разработан для веб-тестирования .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

Хорошо, если вы хотите сделать это со стороны клиента, используя только браузер, у вас есть http://www.jcrawl.com/. После того, как вы спроектировали свой сервис утилизации из веб-приложения ( http://www.jcrawl.com/app.html), вам нужно всего лишь добавить сгенерированный скрипт на страницу HTML, чтобы начать использовать / представлять ваши данные.

Вся логика удаления происходит в браузере через JavaScript. Я надеюсь, что вы найдете это полезным. Нажмите на эту ссылку, чтобы получить живой пример, извлекающий последние новости из тенниса Yahoo.

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

Вы были бы дураком, если бы не использовали Perl.

Возьмите в руки следующие модули и разбирайте гинсу.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

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

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

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

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

Реализации алгоритма синтаксического анализа HTML5: html5lib (Python, Ruby), анализатор HTML Validator.nu (Java, JavaScript; C++ в разработке), Hubbub (C), Twintsam (C#; готовится к выпуску).

Вы, вероятно, уже столько же, но я думаю, что вы пытаетесь это сделать:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackru.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")

Мне нравится функция ImportXML(URL, XPath) в Google Spreadsheets.

Он будет повторять ячейки вниз по столбцу, если ваше выражение XPath возвращает более одного значения.

Вы можете иметь до 50 importxml() функции на одну таблицу.

RapidMiner Web Plugin также довольно прост в использовании. Он может создавать сообщения, принимать файлы cookie и настраивать пользовательский агент.

У меня были смешанные результаты в.NET с использованием SgmlReader, который был первоначально запущен Крисом Ловеттом и, кажется, был обновлен MindTouch.

Я также имел большой успех, используя Aptana's Jaxer + jQuery для разбора страниц. Он не такой быстрый или "подобный сценарию" по своей природе, но селекторы jQuery + настоящий JavaScript/DOM спасают жизни на более сложных (или искаженных) страницах.

Другие вопросы по тегам