ตัวเลือกสำหรับการขูด HTML หรือไม่ [ปิด]


406

ฉันกำลังคิดว่าจะลองBeautiful Soupซึ่งเป็นแพ็คเกจ Python สำหรับการขูด HTML มีแพ็คเกจการขูด HTML อื่น ๆ ที่ฉันควรจะดูหรือไม่ Python ไม่ใช่ข้อกำหนดฉันสนใจที่จะฟังเกี่ยวกับภาษาอื่นเช่นกัน

เรื่องราวที่ผ่านมา:



ลิงก์ Tag Soup ตายแล้ว
Tapper7

HtmlUnit เป็นการใช้งานเบราว์เซอร์ Java ที่สมบูรณ์ซึ่งคุณไม่สามารถแยกออกเป็นส่วน ๆ ได้ (คุณไม่สามารถดาวน์โหลดได้เพียงแค่หน้า html และขูดมันมันจะดาวน์โหลดไฟล์ทั้งหมดที่เรียกใช้งานสคริปต์ ฯลฯ ) เช่นนี้ฉันไม่คิดว่ามันเป็นของที่นี่
Mark Jeronimus

จาวาสต็อกสามารถเดิน HTML ด้วยนิพจน์ XPath แม้ว่าจะไม่มีปัญหา ส่วน parser (DocumentBuilder) ทำให้เกิด HTML ที่ไม่ถูกต้องและ HTML ที่ถูกต้อง 100% นั้นค่อนข้างหายากบนเว็บ ดังนั้นผมจึงต้องการแทนที่ parser กับJTidy สำหรับ XPath XPathExpressionสามารถใช้งานJava ของตัวเองได้ (ซึ่งมีอยู่ตั้งแต่ Java 1.5)
Mark Jeronimus

คำตอบ:


64

ของโลกเทียบเท่ากับทับทิมสวยซุปเป็น why_the_lucky_stiff ของhpricot


12
เหล่านี้คนวันที่ทับทิมได้เปลี่ยนNokogiriสำหรับขูด
Mark Thomas

44

ในโลก. NET ฉันแนะนำ HTML Agility Pack ไม่ใกล้เรียบง่ายเหมือนกับตัวเลือกด้านบนบางตัว (เช่น HTMLSQL) แต่มีความยืดหยุ่นสูง มันช่วยให้คุณสร้าง HTML ที่มีรูปแบบไม่ดีราวกับว่าเป็น XML ที่มีรูปแบบที่ดีดังนั้นคุณจึงสามารถใช้ XPATH หรือเพียงแค่ทำซ้ำผ่านโหนด

http://www.codeplex.com/htmlagilitypack


2
รวม linq กับมันและดูเหมือนว่าจะเหมือน HTMLSQL ไม่ใช่เหรอ?
อวยพร Yahu

3
รวม SharpQuery เข้ากับมันและกลายเป็นเหมือน jQuery! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack ล้มเหลวในการจัดโครงสร้าง DOM สำหรับเอกสาร HTML ที่ฉันพยายาม
Ash Berlin-Taylor

37

BeautifulSoup เป็นวิธีที่ยอดเยี่ยมสำหรับการขูด HTML งานก่อนหน้าของฉันทำให้ฉันต้องขูดเยอะมากและฉันหวังว่าฉันจะรู้เกี่ยวกับ BeautifulSoup เมื่อฉันเริ่ม มันเหมือน DOM ที่มีตัวเลือกที่มีประโยชน์มากมายและมีความไพเราะมากกว่า หากคุณต้องการลองใช้ทับทิมพวกเขาจะย้ายไปที่ BeautifulSoup เรียกว่า RubyfulSoup แต่ยังไม่ได้รับการอัปเดตในขณะนี้

เครื่องมือที่มีประโยชน์อื่น ๆ คือ HTMLParser หรือ sgmllib.SGMLParser ซึ่งเป็นส่วนหนึ่งของ Python Library มาตรฐาน วิธีการเหล่านี้ใช้วิธีการโทรทุกครั้งที่คุณป้อน / ออกจากแท็กและพบข้อความ html พวกเขาเป็นเหมือนชาวต่างชาติหากคุณคุ้นเคยกับสิ่งนั้น ไลบรารีเหล่านี้มีประโยชน์อย่างยิ่งหากคุณกำลังแยกวิเคราะห์ไฟล์ที่มีขนาดใหญ่มากและการสร้างทรี DOM จะยาวและมีราคาแพง

นิพจน์ทั่วไปนั้นไม่จำเป็นมาก BeautifulSoup จัดการการแสดงออกปกติดังนั้นหากคุณต้องการพลังของพวกเขาคุณสามารถใช้มันได้ที่นั่น ฉันว่าไปด้วย BeautifulSoup เว้นเสียแต่ว่าคุณต้องการความเร็วและหน่วยความจำที่เล็กลง หากคุณพบตัวแยกวิเคราะห์ HTML ที่ดีกว่าบน Python แจ้งให้เราทราบ


21

ฉันพบว่าHTMLSQLเป็นวิธีที่ง่ายในการดักหน้าจอ ใช้เวลาไม่กี่นาทีในการรับผลลัพธ์

ข้อความค้นหานั้นใช้งานง่ายสุด ๆ - เช่น:

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

ขณะนี้มีทางเลือกอื่น ๆ ที่ใช้แนวทางเดียวกัน


7
FYI, นี่คือไลบรารี PHP
Tristan Havelick

19

ไลบรารีPython lxmlทำหน้าที่เป็นการรวม Pythonic สำหรับไลบรารี libxml2 และ libxslt ฉันชอบ XPath โดยเฉพาะและการพิมพ์โครงสร้าง XML ในหน่วยความจำ นอกจากนี้ยังรองรับการแยกวิเคราะห์ HTML ที่เสียหาย และฉันไม่คิดว่าคุณจะพบห้องสมุด / การผูก Python อื่นที่แยกวิเคราะห์ XML เร็วกว่า lxml



16

Python มีหลายตัวเลือกสำหรับการขูด HTML นอกเหนือไปจาก Beatiful Soup นี่คือบางส่วนอื่น ๆ :

  • ใช้เครื่องจักร : คล้ายกับ WWW:MechanizePerl ให้เบราว์เซอร์ของคุณเหมือนกับวัตถุที่ไม่ทำงานกับหน้าเว็บ
  • lxml : libwwwงูหลามผูกพันกับ รองรับตัวเลือกที่หลากหลายในการสำรวจและเลือกองค์ประกอบ (เช่นXPathและการเลือก CSS)
  • scrapemark : ไลบรารีระดับสูงโดยใช้เทมเพลตเพื่อดึงข้อมูลจาก HTML
  • pyquery : อนุญาตให้คุณสร้าง jQuery เหมือนคิวรี่บนเอกสาร XML
  • scrapy : การคัดลอกระดับสูงและกรอบการรวบรวมข้อมูลบนเว็บ สามารถใช้ในการเขียนสไปเดอร์สำหรับขุดข้อมูลและตรวจสอบและทดสอบอัตโนมัติ

1
Python Standard Library มี HTML Parser ในตัว ... ทำไมไม่ลองใช้มันดูล่ะ? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

14

'Simple HTML DOM Parser' เป็นตัวเลือกที่ดีสำหรับ PHP หากคุณคุ้นเคยกับตัวเลือก jQuery หรือ JavaScript คุณจะพบว่าคุณอยู่ที่บ้าน

ค้นหาได้ที่นี่

นอกจากนี้ยังมีโพสต์บล็อกเกี่ยวกับที่นี่


1
ฉันสองนี้ ไม่จำเป็นต้องติดตั้ง mod_python ใด ๆ และอื่น ๆ ลงในเว็บเซิร์ฟเวอร์เพียงเพื่อให้มันทำงาน
Brock Woolf


11

templatemakerยูทิลิตี้จากเอเดรีย Holovaty (จากDjangoยี่ห้อ) ใช้วิธีการที่น่าสนใจมาก: คุณอาหารมันรูปแบบของหน้าเดียวกันและ "เรียนรู้" ที่ "หลุม" สำหรับข้อมูลของตัวแปร ไม่ใช่ HTML ที่เฉพาะเจาะจงดังนั้นมันจะดีสำหรับการคัดลอกเนื้อหาธรรมดาอื่น ๆ ด้วย ฉันใช้มันสำหรับ PDF และ HTML ที่แปลงเป็นข้อความธรรมดา (พร้อม pdftotext และ lynx ตามลำดับ)


คุณทำให้ Templatemaker ทำงานกับหน้า HTML ขนาดใหญ่ได้อย่างไร ฉันพบว่ามันขัดข้องเมื่อฉันให้อะไรที่ไม่สำคัญ
hoju

ฉันคิดว่าฉันไม่มีหน้า HTML ขนาดใหญ่ ดูเหมือนจะไม่มีปัญหาที่ยื่นมาสำหรับปัญหานั้นที่code.google.com/p/templatemaker/issues/listดังนั้นจึงอาจเหมาะสมที่จะส่งกรณีทดสอบที่นั่น ดูเหมือนว่า Adrian กำลังดูแลห้องสมุดอยู่ ฉันสงสัยว่าเขาใช้ทุกวันที่ EveryBlock เพราะพวกเขาทำการขูดจำนวนมากอย่างแน่นอน
akaihola

10

ฉันรู้และความรักหน้าจอ Scraper

Screen-Scraper เป็นเครื่องมือสำหรับดึงข้อมูลจากเว็บไซต์ 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

9

ก่อนอื่นฉันจะดูว่าไซต์ดังกล่าวมีเซิร์ฟเวอร์ API หรือ RSS Feeds สำหรับการเข้าถึงข้อมูลที่คุณต้องการหรือไม่


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 อีกก็จะเว็บ :: Scraperซึ่งอยู่บนพื้นฐานของรูบี้Scrapi โดยสรุปด้วยไวยากรณ์ที่ดีและกระชับคุณสามารถรับเครื่องมือที่มีประสิทธิภาพได้โดยตรงในโครงสร้างข้อมูล


7

ฉันประสบความสำเร็จกับHtmlUnitใน Java เป็นเฟรมเวิร์กที่ง่ายสำหรับการเขียนการทดสอบหน่วยบน UI ของเว็บ แต่มีประโยชน์เท่าเทียมกันสำหรับการขูด HTML


คุณยังสามารถใช้ในการประเมินผลการดำเนินงานจาวาสคริปต์ถ้าคุณเคยมีความจำเป็น :)
เดวิด




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

ฉันเคยใช้ซุปที่สวยงามมากกับ Python มันดีกว่าการตรวจสอบนิพจน์ทั่วไปมากเพราะมันใช้งานได้ดีเมื่อใช้DOMแม้ว่า HTML จะมีรูปแบบไม่ดีก็ตาม คุณสามารถค้นหาแท็ก HTML และข้อความด้วยไวยากรณ์ที่ง่ายกว่านิพจน์ทั่วไป เมื่อคุณพบองค์ประกอบคุณสามารถวนซ้ำมันและลูก ๆ ของมันซึ่งมีประโยชน์มากกว่าสำหรับการทำความเข้าใจเนื้อหาในโค้ดมากกว่าที่จะมีการแสดงออกปกติ ฉันหวังว่าจะมีซุปที่สวยงามเมื่อหลายปีก่อนเมื่อฉันต้องทำหน้าจอมากมาย - มันช่วยให้ฉันประหยัดเวลาและปวดหัวเนื่องจากโครงสร้าง 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 .. มาที่นี่แล้ว

กระดูกโมดูลและ ginsu ต่อไปนี้ขูดรอบ ๆ

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 - Parser ที่สร้างต้นไม้ไวยากรณ์

อาจมีการยกของหนักเกินไปที่จะทำอะไรกับวิธีนี้ ฉันไม่ได้ดูโมดูล Mechanize ที่คำตอบอื่นแนะนำดังนั้นฉันอาจทำเช่นนั้นได้



3

ดีถ้าคุณต้องการจะทำจากฝั่งไคลเอ็นต์โดยใช้เพียงเบราว์เซอร์ที่คุณต้องjcrawl.com หลังจากออกแบบบริการ scrapping ของคุณจากเว็บแอปพลิเคชัน ( 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

ผมเคยมีผลการผสมใน .NET ใช้ SgmlReader ซึ่งเริ่มแรกโดยคริส Lovettและดูเหมือนจะได้รับการปรับปรุงโดยเหตุผลที่แจ้ง


2

ฉันชอบฟังก์ชั่น ImportXML (URL, XPath) ของ Google Spreadsheets

มันจะทำซ้ำเซลล์ลงคอลัมน์ถ้านิพจน์ XPath ของคุณส่งคืนมากกว่าหนึ่งค่า

คุณสามารถใช้งานได้มากถึง 50 importxml()ฟังก์ชั่นในสเปรดชีตเดียว

เว็บปลั๊กอินของ RapidMiner นั้นค่อนข้างใช้งานง่าย มันสามารถทำโพสต์ยอมรับคุกกี้และสามารถตั้งค่าuser-agent


2

ฉันประสบความสำเร็จอย่างมากในการใช้ Jaxer + jQuery ของ Aptana เพื่อแยกวิเคราะห์หน้า มันไม่เร็วหรือ 'เหมือนสคริปต์' โดยธรรมชาติ แต่ตัวเลือก jQuery + JavaScript / DOM ที่แท้จริงคือเครื่องมือช่วยชีวิตในหน้าเว็บที่ซับซ้อนมากขึ้น (หรือผิดรูปแบบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.