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


406

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

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



Ссылка на тег супа не работает.
Tapper7

HtmlUnit - это полная реализация браузера Java, которую вы не можете разбить на части (вы не можете загрузить только html-страницу и очистить ее, она загрузит все упомянутые файлы, выполнит сценарии и т. Д.). Как таковой, я не думаю, что это принадлежит здесь.
Марк Жеронимус

Стандартная Java может использовать HTML с выражениями XPath, хотя и не без проблем. Часть анализатора (DocumentBuilder) задыхается от неправильного HTML, и 100% правильный HTML на самом деле довольно редко встречается в сети. Поэтому я люблю заменять парсер на JTidy . Что касается XPath, XPathExpressionможно использовать собственный Java (который существует с Java 1.5)
Марк Джеронимус

Ответы:



44

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

http://www.codeplex.com/htmlagilitypack


2
объединить с ним linq, и это больше похоже на HTMLSQL, не так ли?
Благослови Яху

3
Объедините SharpQuery с ним, и он станет таким же, как jQuery! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack не может правильно структурировать DOM для ряда HTML-документов, которые я пробовал.
Эш Берлин-Тейлор

37

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

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

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


21

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

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

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

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


7
К вашему сведению, это библиотека PHP
Тристан Хавелик,

19

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



16

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

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

1
В стандартной библиотеке Python есть встроенный анализатор HTML ... почему бы просто не использовать это? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

14

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

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

Об этом также есть запись в блоге.


1
Я второй этот. Не нужно устанавливать какой-либо mod_python и т. Д. На веб-сервер только для того, чтобы он работал
Брок Вульф


11

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


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

Я полагаю, у меня не было больших HTML-страниц. Похоже, никаких проблем не найдено по адресу code.google.com/p/templatemaker/issues/list, поэтому, вероятно, целесообразно отправить туда тестовый пример. Не похоже, что Адриан поддерживает библиотеку. Интересно, что он использует в настоящее время в EveryBlock, так как они, безусловно, много скребут.
akaihola

10

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

К сожалению, даже базовая версия не является FOSS. Это только кажется бесплатным, как в пиве.
Андреас Кукарц

9

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


8

Соскоб стек переполнение особенно легко с обувь и 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

8

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


7

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


вы также можете использовать его для оценки выполнения javascript, если вам когда-нибудь понадобится :)
David




5

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

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


5

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


5

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


3

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

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

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

3

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

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

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

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



3

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

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


2

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

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.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")


2

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

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

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

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


2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.