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

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

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

(связанные с)Лучшие методы для анализа HTML
Gordon 16.07.2011 12:51

Ссылка Tag Soup не работает.

Tapper7 20.09.2016 22:03

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

Mark Jeronimus 22.03.2020 11:27

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

Mark Jeronimus 22.03.2020 14:48
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
408
4
182 040
40
Перейти к ответу Данный вопрос помечен как решенный

Ответы 40

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

Ответ принят как подходящий

Эквивалент Beautiful Soup в мире Ruby - это Hpricot почему_the_lucky_stiff.

В наши дни ребята из Ruby перешли на Нокогири для очистки.

Mark Thomas 04.12.2012 19:05

Регулярные выражения также очень хорошо подходят для парсинга HTML ;-) Хотя, посмотрев на Beautiful Soup, я могу понять, почему это может быть ценным инструментом.

Обычные выражения? Центр не может удержать это слишком поздно

Andrew Grimm 22.08.2010 12:00

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

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

Tristan Havelick 18.04.2010 19:19

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

http://www.codeplex.com/htmlagilitypack

объедините с ним linq, и это больше похоже на HTMLSQL, не так ли?

Bless Yahu 22.11.2008 23:16

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

mpen 01.12.2010 08:34

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

Ash Berlin-Taylor 09.08.2012 01:12

Я использовал 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, если вам когда-нибудь понадобится :)

David 14.12.2010 19:28

Библиотека 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-страницами? Я обнаружил, что он вылетает, когда я добавляю ему что-нибудь нетривиальное.

hoju 30.01.2010 17:11

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

akaihola 03.02.2010 11:18

Реализации Алгоритм парсинга 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 и т. д. На веб-сервер, чтобы он работал

Brock Woolf 21.03.2010 16:24

Я знаю и люблю Скребок экрана.

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. Только вроде бы бесплатно, как в пиве.

Andreas Kuckartz 22.04.2014 08:55

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

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

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

ArtOfWarfare 20.07.2015 23:29

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

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

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

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

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

Недавний доклад Дэвида Гласса Добро пожаловать в джунгли! (Вступительный доклад YUIConf 2011) показывает, как вы можете использовать Юй 3 на Node.js для программирования на стороне клиента (с селекторами DOM вместо обработки строк) на сервере. Это очень впечатляет.

Я использую Feedity - http://feedity.com для некоторых работ по очистке (и преобразованию в RSS-каналы) в моей библиотеке. Он хорошо работает для большинства веб-страниц.

SharpQuery

Это в основном jQuery для C#. Это зависит от Пакет гибкости HTML для анализа HTML.

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

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

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

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

Он реализован на Python. И проект все еще жив.

Andreas Kuckartz 22.04.2014 09:03

Есть и такое решение: 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.

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

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

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