Pilihan untuk pengikisan HTML? [Tutup]


406

Saya sedang berpikir untuk mencoba Beautiful Soup , paket Python untuk pengikisan HTML. Apakah ada paket pengikisan HTML lain yang harus saya lihat? Python bukan keharusan, saya sebenarnya tertarik mendengar tentang bahasa lain juga.

Ceritanya sejauh ini:



Tautan Tag Soup sudah mati.
Tapper7

HtmlUnit adalah implementasi peramban Java lengkap yang Anda tidak dapat membedah menjadi beberapa bagian (Anda tidak dapat mengunduh hanya halaman html dan mengikisnya, itu akan mengunduh semua file yang dirujuk, menjalankan skrip, dll.). Karena itu saya tidak berpikir itu milik di sini.
Mark Jeronimus

Stock Java dapat berjalan HTML dengan ekspresi XPath, meskipun bukan tanpa masalah. Bagian parser (DocumentBuilder) tersedak oleh HTML yang salah, dan 100% HTML yang benar sebenarnya cukup langka di web. Karena itu saya ingin mengganti parser dengan JTidy . Sedangkan untuk XPath, Java sendiri XPathExpressiondapat digunakan (yang ada sejak Java 1.5)
Mark Jeronimus

Jawaban:



44

Di dunia .NET, saya merekomendasikan HTML Agility Pack. Tidak sedekat beberapa opsi di atas (seperti HTMLSQL), tetapi sangat fleksibel. Ini memungkinkan Anda membuat HTML yang tidak terbentuk dengan baik seolah-olah itu XML yang dibentuk dengan baik, sehingga Anda dapat menggunakan XPATH atau hanya mengulangi beberapa node.

http://www.codeplex.com/htmlagilitypack


2
menggabungkan LINQ dengan itu dan sepertinya lebih seperti HTMLSQL, bukan?
Bless Yahu

3
Kombinasikan SharpQuery dengan itu, dan itu menjadi seperti jQuery! code.google.com/p/sharp-query
mpen

1
Paket HTML Agility gagal menyusun DOM dengan benar untuk sejumlah dokumen HTML yang telah saya coba.
Ash Berlin-Taylor

37

BeautifulSoup adalah cara terbaik untuk menggores HTML. Pekerjaan saya sebelumnya membuat saya melakukan banyak pengikisan dan saya berharap saya tahu tentang BeautifulSoup ketika saya mulai. Ini seperti DOM dengan banyak opsi yang lebih berguna dan jauh lebih pythonic. Jika Anda ingin mencoba Ruby, mereka mem-porting BeautifulSoup dengan menyebutnya RubyfulSoup tetapi belum diperbarui untuk sementara.

Alat bermanfaat lainnya adalah HTMLParser atau sgmllib.SGMLParser yang merupakan bagian dari pustaka Python standar. Ini bekerja dengan memanggil metode setiap kali Anda memasukkan / keluar tag dan menemukan teks html. Mereka seperti Expat jika Anda terbiasa dengan itu. Pustaka ini sangat berguna jika Anda akan mem-parsing file yang sangat besar dan membuat pohon DOM akan lama dan mahal.

Ekspresi reguler tidak terlalu diperlukan. BeautifulSoup menangani ekspresi reguler sehingga jika Anda membutuhkan kekuatannya, Anda dapat menggunakannya di sana. Saya katakan pergi dengan BeautifulSoup kecuali Anda membutuhkan kecepatan dan jejak memori yang lebih kecil. Jika Anda menemukan parser HTML yang lebih baik di Python, beri tahu saya.


21

Saya menemukan HTMLSQL menjadi cara yang sangat sederhana untuk screenscrape. Dibutuhkan beberapa menit untuk mendapatkan hasilnya.

Pertanyaannya sangat intuitif - seperti:

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

Sekarang ada beberapa alternatif lain yang mengambil pendekatan yang sama.


7
FYI, ini adalah perpustakaan PHP
Tristan Havelick

19

Pustaka Python lxml bertindak sebagai pengikat Pythonic untuk pustaka libxml2 dan libxslt. Saya suka khususnya dukungan XPath dan pencetakan cukup-struktur XML dalam memori. Ini juga mendukung parsing HTML yang rusak. Dan saya tidak berpikir Anda dapat menemukan pustaka / binding Python lain yang mengurai XML lebih cepat dari lxml.



16

Python memiliki beberapa opsi untuk pengikisan HTML selain Beatiful Soup. Berikut ini beberapa lainnya:

  • mekanisasi : mirip dengan perl WWW:Mechanize. Memberi Anda objek seperti browser untuk berinteraksi dengan halaman web
  • lxml : Python mengikat libwww. Mendukung berbagai opsi untuk melintasi dan memilih elemen (mis., Pemilihan XPath dan CSS)
  • scrapemark : perpustakaan tingkat tinggi menggunakan templat untuk mengekstrak informasi dari HTML.
  • pyquery : memungkinkan Anda membuat kueri seperti jQuery pada dokumen XML.
  • scrapy : kerangka kerja pengikisan dan perayapan web tingkat tinggi. Ini dapat digunakan untuk menulis laba-laba, untuk penambangan data dan untuk pemantauan dan pengujian otomatis

1
Python Standard Library memiliki HTML Parser bawaan ... mengapa tidak menggunakannya saja? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

The templatemaker utilitas dari Adrian Holovaty (dari Django ketenaran) menggunakan pendekatan yang sangat menarik: Anda makan itu variasi halaman yang sama dan "belajar" di mana "lubang" untuk data variabel yang. Ini bukan HTML spesifik, jadi itu akan baik untuk mengikis konten plaintext lainnya juga. Saya telah menggunakannya juga untuk PDF dan HTML yang dikonversi ke plaintext (masing-masing dengan pdftotext dan lynx).


bagaimana Anda membuat pembuat templat bekerja untuk halaman HTML besar? Saya menemukan crash ketika saya memberikan sesuatu yang tidak sepele.
hoju

Saya kira saya tidak punya halaman HTML besar. Tampaknya tidak ada Masalah yang diajukan untuk masalah itu di code.google.com/p/templatemaker/issues/list jadi mungkin pantas mengirimkan test case ke sana. Sepertinya Adrian tidak memelihara perpustakaan. Saya ingin tahu apa yang dia gunakan saat ini di EveryBlock karena mereka pasti melakukan banyak pengikisan.
akaihola

10

Saya tahu dan menyukai Screen-Scraper .

Screen-Scraper adalah alat untuk mengekstraksi data dari situs web. Otomasi Layar-Scraper:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

Penggunaan umum:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

Teknis:

* 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

Tiga edisi screen-scraper:

* 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.

Sayangnya bahkan versi Dasarnya adalah FOSS. Sepertinya hanya gratis seperti dalam bir.
Andreas Kuckartz

9

Pertama-tama saya akan mencari tahu apakah situs tersebut menyediakan server API atau RSS Feed untuk mengakses data yang Anda butuhkan.


8

Scraping Stack Overflow sangat mudah dengan Sepatu dan 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

Pilihan lain untuk Perl adalah Web :: Scraper yang didasarkan pada Ruby's Scrapi . Singkatnya, dengan sintaks yang bagus dan ringkas, Anda bisa mendapatkan scraper yang kuat langsung ke struktur data.


7

Saya sudah cukup sukses dengan HtmlUnit , di Jawa. Ini adalah kerangka kerja sederhana untuk menulis unit test pada UI web, tetapi sama-sama berguna untuk pengikisan HTML.


Anda juga dapat menggunakannya untuk mengevaluasi eksekusi javascript jika Anda pernah membutuhkannya :)
David




5

Saya menggunakan Hpricot di Ruby. Sebagai contoh, ini adalah potongan kode yang saya gunakan untuk mengambil semua judul buku dari enam halaman akun HireThings saya (karena mereka tampaknya tidak memberikan satu halaman dengan informasi ini):

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 

Cukup lengkap. Semua yang datang sebelum ini adalah impor perpustakaan dan pengaturan untuk proxy saya.


5

Saya banyak menggunakan Beautiful Soup dengan Python. Ini jauh lebih baik daripada pemeriksaan ekspresi reguler, karena berfungsi seperti menggunakan DOM , bahkan jika HTML berformat buruk. Anda dapat dengan cepat menemukan tag dan teks HTML dengan sintaksis yang lebih sederhana daripada ekspresi reguler. Setelah Anda menemukan elemen, Anda bisa mengulanginya dan anak-anaknya, yang lebih berguna untuk memahami konten dalam kode daripada dengan ekspresi reguler. Saya berharap Beautiful Soup ada bertahun-tahun yang lalu ketika saya harus melakukan banyak screencraping - itu akan menyelamatkan saya banyak waktu dan sakit kepala karena struktur HTML sangat buruk sebelum orang mulai memvalidasinya.


5

Meskipun dirancang untuk pengujian web .NET , saya telah menggunakan kerangka kerja WatiN untuk tujuan ini. Karena berbasis DOM, cukup mudah untuk menangkap HTML, teks, atau gambar. Baru-baru ini, saya menggunakannya untuk membuang daftar tautan dari kueri namespace MediaWiki All Pages ke dalam spreadsheet Excel. Berikut VB.NET kode fragement cukup kasar, tetapi bekerja.


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

Anda akan menjadi bodoh untuk tidak menggunakan Perl .. Di sini nyala api ..

Teliti modul-modul berikut dan ginsu setiap goresan di sekitarnya.

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

3

Saya telah menggunakan LWP dan HTML :: TreeBuilder dengan Perl dan telah menemukan mereka sangat berguna.

LWP (kependekan dari libwww-perl) memungkinkan Anda terhubung ke situs web dan mengikis HTML, Anda bisa mendapatkan modul di sini dan buku O'Reilly tampaknya online di sini .

TreeBuilder memungkinkan Anda membangun pohon dari HTML, dan dokumentasi serta sumber tersedia dalam HTML :: TreeBuilder - Parser yang membuat pohon sintaksis HTML .

Mungkin ada terlalu banyak mengangkat masih harus dilakukan dengan sesuatu seperti pendekatan ini. Saya belum melihat modul Mekanisasi yang disarankan oleh jawaban lain, jadi saya bisa melakukannya.



3

Nah, jika Anda ingin itu dilakukan dari sisi klien hanya menggunakan browser Anda memiliki jcrawl.com . Setelah merancang layanan scrapping Anda dari aplikasi web ( http://www.jcrawl.com/app.html ), Anda hanya perlu menambahkan skrip yang dibuat ke halaman HTML untuk mulai menggunakan / menyajikan data Anda.

Semua logika scrapping terjadi pada browser melalui JavaScript. Semoga bermanfaat. Klik tautan ini untuk contoh langsung yang mengekstrak berita terbaru dari tenis Yahoo .


2

Anda mungkin sudah memiliki sebanyak itu, tetapi saya pikir inilah yang ingin Anda lakukan:

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

Saya suka fungsi ImportXML (URL, XPath) Google Spreadsheets '.

Ini akan mengulangi sel di kolom jika ekspresi XPath Anda mengembalikan lebih dari satu nilai.

Anda dapat memiliki hingga 50 importxml()fungsi pada satu spreadsheet.

Plugin Web RapidMiner juga cukup mudah digunakan. Itu dapat melakukan posting, menerima cookie, dan dapat mengatur agen-pengguna .


2

Saya juga sangat sukses menggunakan Jaxer + jQuery Aptana untuk mem-parsing halaman. Ini tidak secepat atau 'seperti script', tetapi pemilih jQuery + JavaScript asli / DOM adalah penyelamat pada halaman yang lebih rumit (atau salah bentuk).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.