Я подумываю попробовать Красивый суп, пакет Python для парсинга HTML. Есть ли другие пакеты для очистки HTML, на которые мне следует обратить внимание? Python не является обязательным требованием, мне интересно услышать и о других языках.
История до сих пор:
Ссылка Tag Soup не работает.
HtmlUnit - это полная реализация браузера Java, которую нельзя разделить на части (вы не можете загрузить только html-страницу и очистить ее, она загрузит все упомянутые файлы, выполнит сценарии и т. д.). Поэтому я не думаю, что ему здесь место.
Стандартная Java может обходиться HTML с выражениями XPath, хотя и не без проблем. Часть парсера (DocumentBuilder) подавляется некорректным HTML, а 100% правильный HTML на самом деле довольно редко встречается в сети. Поэтому мне нравится заменять парсер на JTidy. Что касается XPath, можно использовать собственный XPathExpression Java (который существует с Java 1.5)






Сначала я бы узнал, предоставляют ли рассматриваемые сайты API-сервер или RSS-каналы для доступа к нужным вам данным.
Регулярные выражения также очень хорошо подходят для парсинга HTML ;-) Хотя, посмотрев на Beautiful Soup, я могу понять, почему это может быть ценным инструментом.
Обычные выражения? Центр не может удержать это слишком поздно
Вероятно, у вас уже есть столько же, но я думаю, что это то, что вы пытаетесь сделать:
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")
Для Perl есть WWW :: Mechanize.
Я использую 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
Это в значительной степени завершено. Все, что предшествует этому, - это импорт библиотеки и настройки моего прокси.
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'
Теперь есть другие альтернативы, использующие тот же подход.
К вашему сведению, это библиотека PHP
В мире .NET я рекомендую HTML Agility Pack. Не так просто, как некоторые из вышеперечисленных вариантов (например, HTMLSQL), но очень гибко. Он позволяет вам манипулировать плохо сформированным HTML, как если бы это был хорошо сформированный XML, поэтому вы можете использовать XPATH или просто выполнять итерацию по узлам.
http://www.codeplex.com/htmlagilitypack
объедините с ним linq, и это больше похоже на HTMLSQL, не так ли?
Объедините с ним SharpQuery, и он станет как jQuery! code.google.com/p/sharp-query
HTML Agility Pack не может правильно структурировать DOM для ряда HTML-документов, которые я пробовал.
Я использовал LWP и HTML :: TreeBuilder с Perl и нашел их очень полезными.
LWP (сокращение от libwww-perl) позволяет подключаться к веб-сайтам и очищать HTML, вы можете получить модуль здесь и книгу О'Рейли кажется здесь онлайн.
TreeBuilder позволяет построить дерево из HTML и документация и исходники доступны в HTML :: TreeBuilder - Парсер, строящий дерево синтаксиса HTML.
Хотя, возможно, придется еще слишком много работать с чем-то вроде этого подхода. Я не смотрел на Модуль механизации, предложенный другим ответом, поэтому я вполне могу это сделать.
Очистить переполнение стека особенно легко с обувь и 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. Это намного лучше, чем проверка регулярного выражения, потому что он работает так же, как использование ДОМ, даже если HTML плохо отформатирован. Вы можете быстро найти HTML-теги и текст с более простым синтаксисом, чем регулярные выражения. Найдя элемент, вы можете перебирать его и его дочерние элементы, что более полезно для понимания содержимого в коде, чем с регулярными выражениями. Хотел бы я, чтобы Beautiful Soup существовал много лет назад, когда мне приходилось много скрапировать экран - это сэкономило бы мне много времени и избавило бы меня от головной боли, поскольку структура HTML была настолько плохой, прежде чем люди начали ее проверять.
В Java вы можете использовать ТегСуп.
Scrubyt использует Ruby и Hpricot для удобного и удобного парсинга веб-страниц. С его помощью я написал скребок для библиотечной службы моего университета примерно за 30 минут.
Другой вариант для Perl - это Web :: Scraper, основанный на Ruby Скрапи. Короче говоря, с красивым и лаконичным синтаксисом вы можете получить надежный скребок прямо в структуры данных.
Хотя он был разработан для веб-тестирования .СЕТЬ, я использовал для этой цели фреймворк 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
У меня были смешанные результаты в .NET с использованием SgmlReader, который изначально был запущен Крис Ловетт и, похоже, был обновлен MindTouch.
У меня был некоторый успех с HtmlUnit на Java. Это простая структура для написания модульных тестов для веб-интерфейса, но не менее полезна для парсинга HTML.
вы также можете использовать его для оценки выполнения javascript, если вам когда-нибудь понадобится :)
Библиотека Python lxml действует как привязка Pythonic для библиотек libxml2 и libxslt. Мне особенно нравится его поддержка XPath и красивая распечатка XML-структуры в памяти. Он также поддерживает парсинг сломанного HTML. И я не думаю, что вы можете найти другие библиотеки / привязки Python, которые анализируют XML быстрее, чем lxml.
Было бы глупо не использовать Perl .. Вот и пламя ..
Сделайте кость на следующих модулях и наскребите гинсу.
use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
Утилита создатель шаблонов от Адриана Головати (известного Джанго) использует очень интересный подход: вы скармливаете ей варианты одной и той же страницы, и она «узнает», где находятся «дыры» для переменных данных. Он не специфичен для HTML, поэтому его также можно использовать для очистки любого другого текстового содержимого. Я использовал его также для PDF-файлов и HTML, преобразованных в обычный текст (с pdftotext и lynx соответственно).
как вы заставили создателя шаблонов работать с большими HTML-страницами? Я обнаружил, что он вылетает, когда я добавляю ему что-нибудь нетривиальное.
Полагаю, у меня не было больших HTML-страниц. Похоже, что для этой проблемы в code.google.com/p/templatemaker/issues/list нет зарегистрированных проблем, поэтому, вероятно, уместно отправить туда тестовый пример. Однако не похоже, что Адриан обслуживает библиотеку. Интересно, что он использует сейчас в EveryBlock, поскольку они, безусловно, много занимаются очисткой.
Реализации Алгоритм парсинга HTML5: html5lib (Python, Ruby), Validator.nu HTML Parser (Java, JavaScript; C++ в разработке), Hubbub (C), Twintsam (C#; скоро).
Я также добился большого успеха, используя Jaxer + jQuery от Aptana для анализа страниц. Это не так быстро или «похоже на скрипт» по своей природе, но селекторы jQuery + настоящий JavaScript / DOM - спасатель на более сложных (или искаженных) страницах.
Другой инструмент для .NET - MhtBuilder
«Simple HTML DOM Parser» - хороший вариант для PHP, если вы знакомы с селекторами jQuery или JavaScript, тогда вы почувствуете себя как дома.
Здесь также есть запись в блоге.
Я второй. Не нужно устанавливать какой-либо mod_python и т. д. На веб-сервер, чтобы он работал
Я знаю и люблю Скребок экрана.
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. Только вроде бы бесплатно, как в пиве.
В Python есть несколько опций для парсинга HTML в дополнение к Beatiful Soup. Вот еще несколько:
WWW:Mechanize. Предоставляет вам объект, похожий на браузер, для взаимодействия с веб-страницамиlibwww. Поддерживает различные варианты перемещения и выбора элементов (например, XPath и выбор CSS)Стандартная библиотека Python имеет встроенный HTML-парсер ... почему бы просто не использовать его? docs.python.org/2.7/library/htmlparser.html
Для более сложных приложений парсинга я бы порекомендовал веб-парсер IRobotSoft. Это специальная бесплатная программа для очистки экрана. Он имеет мощный язык запросов для HTML-страниц и очень простой интерфейс веб-записи, который избавит вас от многих усилий по программированию.
Мне нравится функция ImportXML (URL, XPath) в Google Spreadsheets.
Он будет повторять ячейки вниз по столбцу, если выражение XPath возвращает более одного значения.
В одной таблице может быть до 50 функций importxml().
Веб-плагин RapidMiner также довольно прост в использовании. Он может отправлять сообщения, принимать файлы cookie и может устанавливать пользовательский агент.
Недавний доклад Дэвида Гласса Добро пожаловать в джунгли! (Вступительный доклад YUIConf 2011) показывает, как вы можете использовать Юй 3 на Node.js для программирования на стороне клиента (с селекторами DOM вместо обработки строк) на сервере. Это очень впечатляет.
Я использую Feedity - http://feedity.com для некоторых работ по очистке (и преобразованию в RSS-каналы) в моей библиотеке. Он хорошо работает для большинства веб-страниц.
Это в основном jQuery для C#. Это зависит от Пакет гибкости HTML для анализа HTML.
Для тех, кто предпочитает графический инструмент рабочего процесса, RapidMiner (FOSS) предлагает удобное средство сканирования и сканирования в Интернете.
Вот серия видео:
http://vancouverdata.blogspot.com/2011/04/rapidminer-web-crawling-rapid-miner-web.html
Я много занимаюсь продвинутым парсингом веб-страниц, поэтому хотел полностью контролировать свой стек и понимать ограничения. Эта веб-библиотека - результат.
Он реализован на Python. И проект все еще жив.
Есть и такое решение: netty HttpClient
Почему еще никто не упомянул JSOUP для Java? http://jsoup.org/
Я сделал очень хорошую библиотеку Интернет-инструменты для парсинга веб-страниц.
Идея состоит в том, чтобы сопоставить шаблон с веб-страницей, который будет извлекать все данные со страницы, а также проверять, не изменилась ли структура страницы.
Таким образом, вы можете просто взять HTML-код веб-страницы, которую хотите обработать, удалить весь динамический или нерелевантный контент и аннотировать интересные части.
Например. HTML для нового вопроса на индексной странице stackoverflow.com:
<div id = "question-summary-11326954" class = "question-summary narrow">
<!-- skipped, this is getting too long -->
<div class = "summary">
<h3><a title = "Some times my tree list have vertical scroll ,then I scrolled very fast and the tree list shivered .Have any solution for this.
" class = "question-hyperlink" href = "/questions/11326954/about-scroll-bar-issue-in-tree">About Scroll bar issue in Tree</a></h3>
<!-- skipped -->
</div>
</div>
Итак, вы просто удалите этот определенный идентификатор, заголовок и сводку, чтобы создать шаблон, который будет читать все новые вопросы в заголовке, сводке, массивах ссылок:
<t:loop>
<div class = "question-summary narrow">
<div class = "summary">
<h3>
<a class = "question-hyperlink">
{title:=text(), summary:=@title, link:=@href}
</a>
</h3>
</div>
</div>
</t:loop>
И, конечно же, он также поддерживает основные методы, селекторы CSS 3, выражения XPath 2 и XQuery 1.
Единственная проблема в том, что я был настолько глуп, что сделал ее библиотекой Свободный Паскаль. Но есть также независимый от языка веб-демонстрация.
Что ж, если вы хотите, чтобы это выполнялось на стороне клиента, используя только браузер, у вас есть jcrawl.com. После разработки службы удаления из веб-приложения (http://www.jcrawl.com/app.html) вам нужно только добавить сгенерированный скрипт на HTML-страницу, чтобы начать использовать / представлять свои данные.
Вся логика удаления происходит в браузере через JavaScript. Надеюсь, вы сочтете это полезным. Щелкните эту ссылку, чтобы просмотреть живой пример, извлекающий последние новости Yahoo Tennis.