HTML kazıma seçenekleri? [kapalı]


406

HTML kazıma için bir Python paketi olan Beautiful Soup'u denemeyi düşünüyorum . Bakmam gereken başka HTML kazıma paketleri var mı? Python bir gereklilik değil, aslında diğer dilleri de duymakla ilgileniyorum.

Hikaye şimdiye kadar:



Etiket Çorbası bağlantısı öldü.
Tapper7

HtmlUnit, parçalara ayıramayacağınız eksiksiz bir Java tarayıcı uygulamasıdır ( sadece bir html sayfası indirip kazımazsınız, atıfta bulunulan tüm dosyaları indirir, komut dosyalarını çalıştırır vb.). Bu yüzden buraya ait olduğunu sanmıyorum.
Mark Jeronimus

Stok Java sorunsuz olsa da XPath ifadeleri ile HTML yürüyebilir. Ayrıştırıcı kısmı (DocumentBuilder) yanlış HTML'yi boğar ve% 100 doğru HTML aslında web'de oldukça nadirdir. Bu nedenle ayrıştırıcıyı JTidy ile değiştirmeyi seviyorum . XPath ile ilgili olarak, Java'nın kendi XPathExpression(Java 1.5'ten beri var) kullanılabilir
Mark Jeronimus

Yanıtlar:



44

.NET dünyasında HTML Çeviklik Paketi'ni öneririm. Yukarıdaki seçeneklerden bazıları kadar basit değil (HTMLSQL gibi), ancak çok esnektir. Kötü biçimlendirilmiş HTML'yi iyi biçimlendirilmiş XMLymiş gibi manipüle etmenizi sağlar, böylece XPATH'yi kullanabilir veya sadece düğümler üzerinde tekrarlayabilirsiniz.

http://www.codeplex.com/htmlagilitypack


2
onunla linq birleştirmek ve daha HTMLSQL gibi görünüyor, değil mi?
Yahu Koru

3
SharpQuery'yi onunla birleştirin ve jQuery gibi olur! code.google.com/p/sharp-query
mpen

1
HTML Çeviklik Paketi, denedim.
Ash Berlin-Taylor

37

BeautifulSoup HTML kazıma için harika bir yoldur. Önceki işim çok fazla kazıma yapmamı ve keşke başladığımda BeautifulSoup'u bilseydim. Çok daha kullanışlı seçeneklere sahip DOM gibi ve çok daha pitonik. Ruby'yi denemek istiyorsanız BeautifulSoup'u RubyfulSoup olarak adlandırdım, ancak bir süredir güncellenmedi.

Diğer yararlı araçlar, standart Python kitaplığının bir parçası olan HTMLParser veya sgmllib.SGMLParser'dır. Bunlar, her etiket girdiğinizde / çıktığınızda ve html metni ile karşılaştığınızda yöntemleri çağırarak çalışır. Eğer aşina iseniz Expat gibiler. Bu kütüphaneler özellikle çok büyük dosyaları ayrıştıracaksanız ve bir DOM ağacı oluşturmak uzun ve pahalı olacaksa kullanışlıdır.

Düzenli ifadeler çok gerekli değildir. BeautifulSoup düzenli ifadeleri işler, böylece güçlerine ihtiyacınız varsa onu burada kullanabilirsiniz. Hıza ve daha küçük bir bellek alanına ihtiyaç duymadığınız sürece BeautifulSoup ile git diyorum. Python'da daha iyi bir HTML ayrıştırıcı bulursanız bana bildirin.


21

HTMLSQL'i ekran taraması için gülünç basit bir yol olarak buldum . Sonuçların alınması tam anlamıyla dakikalar alır.

Sorgular süper sezgiseldir:

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

Şimdi aynı yaklaşımı benimseyen başka alternatifler de var.


7
Bilginize, bu bir PHP kütüphanesi
Tristan Havelick

19

Python lxml kütüphanesi, libxml2 ve libxslt kütüphaneleri için bir Pythonic bağlama görevi görür. Özellikle XPath desteğini ve bellek içi XML yapısının güzel yazdırılmasını seviyorum. Ayrıca bozuk HTML'nin ayrıştırılmasını da destekler. Ve XML'i lxml'den daha hızlı ayrıştıran diğer Python kitaplıklarını / bağlarını bulabileceğinizi sanmıyorum.



16

Python, Beatiful Soup'a ek olarak HTML kazıma için çeşitli seçeneklere sahiptir. İşte bazıları:

  • mekanize : perl'e benzer WWW:Mechanize. Web sayfalarıyla etkileşime girmeniz için tarayıcı benzeri bir nesne sunar
  • lxml : Python'a bağlanıyorlibwww . Öğeleri çaprazlamak ve seçmek için çeşitli seçenekleri destekler (örn. XPath ve CSS seçimi)
  • scrapemark : HTML'den bilgi almak için şablonlar kullanan üst düzey kütüphane.
  • pyquery : XML belgelerinde jQuery benzeri sorgular yapmanıza olanak tanır.
  • scrapy : yüksek seviyeli bir kazıma ve web tarama çerçevesi. Örümcek yazmak, veri madenciliği ve izleme ve otomatik test için kullanılabilir

1
Python Standard Library'de yerleşik bir HTML Ayrıştırıcı vardır ... docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

Templatemaker (Adrian Holovaty dan yarar Django ün) çok ilginç bir yaklaşım kullanır: Sen bunu aynı sayfanın çeşitlemelerini ve değişken veriler için "delik" dir o "öğrenir" beslenirler. HTML'ye özgü değildir, bu nedenle diğer düz metin içeriklerini de kazımak için iyi olur. Ben de düz metin dönüştürülmüş PDF ve HTML için kullandım (sırasıyla pdftotext ve lynx ile).


templatemaker'ın büyük HTML sayfaları için nasıl çalışmasını sağladınız? Önemsiz bir şey verdiğimde çöktüğünü fark ettim.
Ocak'ta hoju

Sanırım büyük HTML sayfam yoktu. Code.google.com/p/templatemaker/issues/list adresinde bu sorunla ilgili hiçbir Sorun yok gibi görünüyor . Adrian kitaplığı koruyor gibi görünmüyor. Kesinlikle çok fazla kazıma yaptıkları için bugünlerde EveryBlock'ta ne kullandığını merak ediyorum.
akaihola

10

Biliyorum ve seviyorum Screen-Scraper'ı .

Screen-Scraper web sitelerinden veri ayıklamak için bir araçtır. Screen-Scraper otomatları:

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

Ortak kullanımlar:

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

Teknik:

* 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

Üç ekran sıyırıcı sürümü:

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

Ne yazık ki Temel sürüm bile FOSS değil. Sadece birada olduğu gibi özgür görünüyor.
Andreas Kuckartz

9

Öncelikle, söz konusu sitelerin, ihtiyaç duyduğunuz verilere erişmek için bir API sunucusu veya RSS Beslemeleri sağlayıp sağlamadığını öğrenirim.


8

Yığın Taşması Kazıma özellikle Ayakkabı ve Hpricot ile kolaydır .

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 için başka bir seçenek de Ruby'nin Scrapi'sine dayanan Web :: Scraper olacaktır . Özetle, hoş ve özlü sözdizimi ile, doğrudan veri yapılarına sağlam bir kazıyıcı alabilirsiniz.


7

Java'da HtmlUnit ile bazı başarılar elde ettim . Web kullanıcı arayüzlerine birim testleri yazmak için basit bir çerçevedir, ancak HTML kazıma için de aynı derecede yararlıdır.


İhtiyacınız varsa javascript yürütmesini değerlendirmek için de kullanabilirsiniz :)
David




5

Ruby'de Hpricot kullanıyorum. Örnek olarak, bu, HireThings hesabımın altı sayfasından tüm kitap başlıklarını almak için kullandığım bir kod snippet'idir (çünkü bu bilgilerle tek bir sayfa sağlamıyor gibi görünüyorlar):

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 

Neredeyse tamamlandı. Bundan önce gelen tek şey kütüphane ithalatı ve vekil sunucu ayarlarım.


5

Python ile Beautiful Soup'u çok kullandım. HTML kötü biçimlendirilmiş olsa bile , DOM'u kullanmak gibi çalıştığından, normal ifade kontrolünden çok daha iyidir . HTML etiketlerini ve metni normal ifadelerden daha basit sözdizimiyle hızlı bir şekilde bulabilirsiniz. Bir öğeyi bulduktan sonra, onu ve çocuklarını yineleyebilirsiniz, bu da koddaki içeriği normal ifadelerde olduğundan daha yararlıdır. Keşke Güzel Çorba yıllar önce çok fazla ekran kırma yapmam gerektiğinde mevcut olsaydı - HTML yapısı insanlar onaylanmadan önce çok zayıf olduğu için bana çok zaman ve baş ağrısı kazandıracaktı.


5

Her ne kadar .NET web testi için tasarlanmış olsa da, bu amaçla WatiN çerçevesini kullanıyorum . DOM tabanlı olduğundan HTML, metin veya resim yakalamak oldukça kolaydır. Son zamanlarda, bir MediaWiki Tüm Sayfalar ad alanı sorgusundaki bağlantıların listesini Excel e-tablosuna dökmek için kullandım. Aşağıdaki VB.NET kod parçası oldukça kaba, ama çalışıyor.


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'i kullanmamak için aptal olurdun .. İşte alevler geliyor ..

Aşağıdaki modülleri kemikleyin ve etrafta herhangi bir kazıma yapın.

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

3

Ben kullandım LWP ve HTML :: TreeBuilderPerl ile onları çok yararlı buldum.

LWP (libwww-perl kısaltması) web sitelerine bağlanmanıza ve HTML'yi kazımanıza izin verir , modülü buradan alabilirsiniz ve O'Reilly kitabı burada çevrimiçi görünüyor .

TreeBuilder HTML'den bir ağaç oluşturmanıza izin verir ve HTML :: TreeBuilder - HTML sözdizimi ağacı oluşturan ayrıştırıcıda belge ve kaynak mevcuttur .

Yine de bu yaklaşım gibi bir şeyle çok fazla ağır kaldırma olabilir. Başka bir cevap tarafından önerilen Mechanize modülüne bakmadım , bu yüzden bunu yapabilirim.



3

Eh, sadece bir tarayıcı kullanarak istemci tarafından yapılmasını istiyorsanız jcrawl.com var . Hurdaya çıkarma servisinizi web uygulamasından tasarladıktan sonra ( http://www.jcrawl.com/app.html ) , verilerinizi kullanmaya / sunmaya başlamak için yalnızca oluşturulan komut dosyasını bir HTML sayfasına eklemeniz gerekir.

Tüm hurdaya çıkarma mantığı tarayıcıda JavaScript aracılığıyla gerçekleşir. Umarım faydalı bulursunuz. Yahoo tenisinde en son haberleri alan canlı bir örnek için bu bağlantıyı tıklayın .


2

Muhtemelen zaten var, ama bence yapmaya çalıştığın şey bu:

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

Google E-Tablolar'ın ImportXML (URL, XPath) işlevini seviyorum.

XPath ifadeniz birden fazla değer döndürürse hücreleri sütunda tekrarlar.

importxml()Bir e-tabloda en fazla 50 işleviniz olabilir .

RapidMiner Web Eklentisinin kullanımı da oldukça kolaydır. Gönderiler yapabilir, çerezleri kabul edebilir ve kullanıcı aracısını ayarlayabilir .


2

Sayfaları ayrıştırmak için Aptana'nın Jaxer + jQuery'ini de kullandım. Doğada o kadar hızlı veya 'komut dosyası benzeri' değil, ancak jQuery seçicileri + gerçek JavaScript / DOM, daha karmaşık (veya hatalı biçimlendirilmiş) sayfalarda cankurtaran.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.