Варіанти скребтування 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 я рекомендую пакет програм Agility. Не так просто, як деякі з перерахованих вище варіантів (наприклад, HTMLSQL), але він дуже гнучкий. Це дозволяє вам маніпулювати погано сформований HTML так, як якщо б він був добре сформованим XML, тож ви можете використовувати XPATH або просто перетворити його над вузлами.

http://www.codeplex.com/htmlagilitypack


2
комбінуйте linq з ним, і це здається більше схожим на HTMLSQL, ні?
Благословіть Яху

3
Поєднайте SharpQuery з ним, і він стає так само, як jQuery! code.google.com/p/sharp-query
mpen

1
Пакет спритності HTML не вдається правильно структурувати 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
FYI, це бібліотека PHP
Трістан Хавелік

19

Бібліотека lxml Python діє як пітонічне зв'язування для бібліотек libxml2 та libxslt. Особливо мені подобається підтримка XPath та гарне друкування структури XML в пам'яті. Він також підтримує аналіз зламаного HTML. І я не думаю, що ви можете знайти інші бібліотеки / прив'язки Python, які аналізують XML швидше, ніж lxml.



16

Python має кілька варіантів для скребкування HTML на додаток до Beatiful Soup. Ось деякі інші:

  • механізатор : схожий на перл WWW:Mechanize. Надає браузерові об’єкт, який не впливає на веб-сторінки
  • lxml : прив'язка Python до libwww. Підтримує різні варіанти переходу та вибору елементів (наприклад, вибір XPath та CSS)
  • scrapemark : бібліотека високого рівня, що використовує шаблони для отримання інформації з HTML.
  • pyquery : дозволяє робити jQuery як запити на XML-документах.
  • скрапія : рамки для вискоблювання та сканування на високому рівні. Його можна використовувати для запису павуків, для вилучення даних та для моніторингу та автоматизованого тестування

1
Стандартна бібліотека Python має вбудований HTML-аналізатор ... чому б не просто використовувати це? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

14

«Простий парсер HTML DOM» - це хороший варіант для PHP, якщо ви знайомі з селекторами jQuery або JavaScript, то ви опинитесь вдома.

Знайдіть його тут

Тут також є публікація в блозі.


1
Я другий цей. Не потрібно встановлювати будь-який модуль mod_python тощо на веб-сервер просто для того, щоб він працював
Brock Woolf


11

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


як ви змусили виробника шаблонів працювати на великих HTML-сторінках? Я виявив, що це збої, коли я даю йому щось нетривіальне.
ходжу

Я думаю, у мене не було великих HTML-сторінок. Немає поданих випусків для цієї проблеми на code.google.com/p/templatemaker/isissue/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 Ruby . У двох словах, з приємним і стислим синтаксисом ви можете отримати надійний скрепер безпосередньо в структури даних.


7

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


ви також можете використовувати його для оцінки виконання JavaScript, якщо у вас коли-небудь виникне потреба :)
Девід




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-код, ви можете отримати модуль тут, і книга O'Reilly, здається, є в Інтернеті тут .

TreeBuilder дозволяє побудувати дерево з HTML, а документація та джерело доступні в HTML :: TreeBuilder - Парсер, що створює синтаксичне дерево HTML .

Але може бути занадто багато важкого підйому все ж таки, щоб зробити щось подібне до такого підходу. Я не переглянув модуль Механізм, запропонований іншою відповіддю, тому я цілком можу це зробити.



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.

Це повторить комірки в стовпчик, якщо вираз XPath поверне більше одного значення.

Можна мати до 50 importxml()На одній таблиці функцій.

Веб-плагін RapidMiner також досить простий у використанні. Він може робити публікації, приймати файли cookie та встановлювати користувальницький агент .


2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.