Tùy chọn để quét HTML? [đóng cửa]


406

Tôi đang nghĩ đến việc dùng thử Beautiful Soup , một gói Python để quét HTML. Có bất kỳ gói nạo HTML nào khác mà tôi nên xem không? Python không phải là một yêu cầu, tôi thực sự muốn nghe về các ngôn ngữ khác.

Câu chuyện cho đến nay:



Liên kết Tag Soup đã chết.
Tapper7

HtmlUnit là một triển khai trình duyệt Java hoàn chỉnh mà bạn không thể phân tích thành các phần (bạn không thể tải xuống chỉ một trang html và cạo nó, nó sẽ tải xuống tất cả các tệp được giới thiệu, thực thi các tập lệnh, v.v.). Như vậy tôi không nghĩ nó thuộc về nơi này.
Mark Jeronimus

Stock Java có thể đi bộ HTML với các biểu thức XPath, mặc dù không phải không có vấn đề. Phần trình phân tích cú pháp (DocumentBuilder) bị kẹt trên HTML không chính xác và HTML chính xác 100% thực sự khá hiếm trên web. Vì vậy, tôi muốn thay thế trình phân tích cú pháp bằng JTidy . Đối với XPath, XPathExpressioncó thể sử dụng riêng Java (tồn tại từ Java 1.5)
Mark Jeronimus

Câu trả lời:



44

Trong thế giới .NET, tôi khuyên dùng Gói Agility HTML. Không đơn giản như một số tùy chọn ở trên (như HTMLQuery), nhưng nó rất linh hoạt. Nó cho phép bạn điều khiển HTML được định dạng kém như thể nó là XML được hình thành tốt, vì vậy bạn có thể sử dụng XPATH hoặc chỉ lặp lại qua các nút.

http://www.codeplex.com/htmlagilitypack


2
kết hợp linq với nó và nó có vẻ giống như HTMLQuery hơn, phải không?
Bless Yahu

3
Kết hợp SharpQuery với nó và nó trở nên giống như jQuery! code.google.com/p/sharp-query
mpen

1
Gói Agility HTML không cấu trúc chính xác DOM cho một số tài liệu HTML mà tôi đã thử.
Ash Berlin-Taylor

37

BeautifulSoup là một cách tuyệt vời để sử dụng HTML. Công việc trước đây của tôi đã cho tôi làm rất nhiều việc và tôi ước tôi biết về BeautifulSoup khi tôi bắt đầu. Nó giống như DOM với nhiều tùy chọn hữu ích hơn và nhiều pythonic hơn. Nếu bạn muốn dùng thử Ruby, họ đã chuyển BeautifulSoup gọi nó là RubyfulSoup nhưng nó đã không được cập nhật trong một thời gian.

Các công cụ hữu ích khác là HTMLParser hoặc sgmllib.SGMLParser là một phần của thư viện Python chuẩn. Chúng hoạt động bằng cách gọi các phương thức mỗi khi bạn nhập / thoát thẻ và gặp văn bản html. Họ giống như người nước ngoài nếu bạn quen thuộc với điều đó. Các thư viện này đặc biệt hữu ích nếu bạn định phân tích các tệp rất lớn và việc tạo một cây DOM sẽ rất dài và tốn kém.

Biểu thức chính quy không cần thiết lắm. BeautifulSoup xử lý các biểu thức thông thường để nếu bạn cần sức mạnh của chúng, bạn có thể sử dụng nó ở đó. Tôi nói hãy đi với BeautifulSoup trừ khi bạn cần tốc độ và dung lượng bộ nhớ nhỏ hơn. Nếu bạn tìm thấy trình phân tích cú pháp HTML tốt hơn trên Python, hãy cho tôi biết.


21

Tôi thấy HTMLQuery là một cách đơn giản đến nực cười đối với màn hình. Phải mất vài phút để có kết quả với nó.

Các truy vấn siêu trực quan - như:

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

Bây giờ có một số lựa chọn thay thế khác có cùng một cách tiếp cận.


7
FYI, đây là một thư viện PHP
Tristan Havelick

19

Thư viện lxml Python hoạt động như một liên kết Pythonic cho các thư viện libxml2 và libxslt. Tôi đặc biệt thích hỗ trợ XPath của nó và in đẹp cấu trúc XML trong bộ nhớ. Nó cũng hỗ trợ phân tích cú pháp HTML bị hỏng. Và tôi không nghĩ rằng bạn có thể tìm thấy các thư viện / liên kết Python khác phân tích cú pháp XML nhanh hơn lxml.



16

Python có một số tùy chọn để quét HTML ngoài Beatty Soup. Đây là một số người khác:

  • cơ giới hóa : tương tự như perl WWW:Mechanize. Cung cấp cho bạn một đối tượng như trình duyệt để không hoạt động với các trang web
  • lxml : Python liên kết với libwww. Hỗ trợ các tùy chọn khác nhau để duyệt và chọn các thành phần (ví dụ: lựa chọn XPath và CSS)
  • Wasteemark : thư viện cấp cao sử dụng các mẫu để trích xuất thông tin từ HTML.
  • pyquery : cho phép bạn tạo jQuery như các truy vấn trên các tài liệu XML.
  • phế liệu : một khung quét web và thu thập dữ liệu cao cấp. Nó có thể được sử dụng để viết các con nhện, để khai thác dữ liệu và để theo dõi và kiểm tra tự động

1
Thư viện chuẩn Python có Trình phân tích cú pháp HTML tích hợp ... tại sao không sử dụng? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

Các templatemaker tiện ích từ Adrian Holovaty (của Django nổi tiếng) sử dụng một cách tiếp cận rất thú vị: Bạn ăn nó biến thể của cùng một trang và nó "nghe tin", nơi các "lỗ hổng" cho dữ liệu biến là. Nó không phải là HTML cụ thể, vì vậy nó cũng tốt cho việc loại bỏ bất kỳ nội dung văn bản gốc nào khác. Tôi cũng đã sử dụng nó cho các tệp PDF và HTML được chuyển đổi thành bản rõ (tương ứng với pdftotext và lynx).


Làm thế nào bạn có được templHRaker làm việc cho các trang HTML lớn? Tôi tìm thấy nó sụp đổ khi tôi cho nó bất cứ điều gì không tầm thường.
hoju

Tôi cho rằng tôi không có trang HTML lớn. Không có vấn đề được đệ trình nào tồn tại cho vấn đề đó tại code.google.com/p/templatemaker/issues/list vì vậy có lẽ nên gửi trường hợp thử nghiệm ở đó. Dường như không phải là Adrian đang duy trì thư viện. Tôi tự hỏi những gì anh ấy sử dụng ngày nay tại EveryBlock vì họ chắc chắn làm rất nhiều việc.
akaihola

10

Tôi biết và yêu thích Screen-Scraper .

Trình quét màn hình là một công cụ để trích xuất dữ liệu từ các trang web. Trình quét màn hình tự động hóa:

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

Sử dụng phổ biến:

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

Kỹ thuật:

* 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

Ba phiên bản của màn hình cạp:

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

Thật không may, ngay cả phiên bản cơ bản là FOSS. Nó chỉ có vẻ là miễn phí như trong bia.
Andreas Kuckartz

9

Trước tiên tôi sẽ tìm hiểu xem (các) trang web được đề cập có cung cấp máy chủ API hoặc Nguồn cấp RSS để truy cập dữ liệu bạn yêu cầu hay không.


8

Scraping Stack Overflow đặc biệt dễ dàng với GiàyHpricot .

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

Một tùy chọn khác cho Perl sẽ là Web :: Scraper dựa trên Ruby's Scrapi . Tóm lại, với cú pháp hay và súc tích, bạn có thể lấy một bộ cạp mạnh mẽ trực tiếp vào các cấu trúc dữ liệu.


7

Tôi đã có một số thành công với HtmlUnit , trong Java. Đó là một khung đơn giản để viết các bài kiểm tra đơn vị trên giao diện người dùng web, nhưng cũng hữu ích không kém cho việc quét HTML.


bạn cũng có thể sử dụng nó để đánh giá việc thực thi javascript nếu bạn có nhu cầu :)
David




5

Tôi sử dụng Hpricot trên Ruby. Ví dụ, đây là một đoạn mã mà tôi sử dụng để truy xuất tất cả các đầu sách từ sáu trang trong tài khoản HireThings của tôi (vì dường như chúng không cung cấp một trang nào với thông tin này):

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 

Nó đã hoàn thành khá nhiều. Tất cả những gì xuất hiện trước đây là nhập thư viện và cài đặt cho proxy của tôi.


5

Tôi đã sử dụng Beautiful Soup rất nhiều với Python. Nó tốt hơn nhiều so với kiểm tra biểu thức thông thường, bởi vì nó hoạt động như sử dụng DOM , ngay cả khi HTML được định dạng kém. Bạn có thể nhanh chóng tìm thấy các thẻ và văn bản HTML với cú pháp đơn giản hơn các biểu thức thông thường. Khi bạn tìm thấy một phần tử, bạn có thể lặp lại nó và các phần tử con, điều này hữu ích hơn để hiểu nội dung trong mã so với các biểu thức thông thường. Tôi ước Beautiful Soup tồn tại nhiều năm trước khi tôi phải thực hiện nhiều thao tác sàng lọc - nó sẽ giúp tôi tiết kiệm rất nhiều thời gian và đau đầu vì cấu trúc HTML rất kém trước khi mọi người bắt đầu xác thực nó.


5

Mặc dù nó được thiết kế để kiểm tra web .NET , tôi đã sử dụng khung WatiN cho mục đích này. Vì nó dựa trên DOM, nên việc chụp HTML, văn bản hoặc hình ảnh khá dễ dàng. Gần đây, tôi đã sử dụng nó để kết xuất một danh sách các liên kết từ truy vấn không gian tên MediaWiki All Pages vào bảng tính Excel. Đoạn mã VB.NET sau đây khá thô, nhưng nó hoạt động.


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

Bạn sẽ là một kẻ ngốc không sử dụng Perl .. Đây là ngọn lửa ..

Xương lên trên các mô-đun sau đây và ginsu bất kỳ cạo xung quanh.

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

3

Tôi đã sử dụng LWPHTML :: TreeBuilder với Perl và thấy chúng rất hữu ích.

LWP (viết tắt của libwww-perl) cho phép bạn kết nối với các trang web và quét HTML, bạn có thể lấy mô-đun ở đây và cuốn sách O'Reilly dường như đang trực tuyến tại đây .

TreeBuilder cho phép bạn xây dựng một cây từ HTML và tài liệu và nguồn có sẵn trong HTML :: TreeBuilder - Trình phân tích cú pháp xây dựng cây cú pháp HTML .

Có thể có quá nhiều việc nặng nhọc vẫn phải làm với một cái gì đó giống như phương pháp này. Tôi đã không nhìn vào mô-đun Cơ giới được đề xuất bởi một câu trả lời khác, vì vậy tôi cũng có thể làm điều đó.



3

Chà, nếu bạn muốn nó được thực hiện từ phía khách hàng chỉ bằng một trình duyệt bạn có jcrawl.com . Sau khi đã thiết kế dịch vụ loại bỏ của bạn từ ứng dụng web ( http://www.jcrawl.com/app.html ), bạn chỉ cần thêm tập lệnh được tạo vào trang HTML để bắt đầu sử dụng / trình bày dữ liệu của mình.

Tất cả logic loại bỏ xảy ra trên trình duyệt thông qua JavaScript. Tôi hy vọng bạn thấy nó hữu dụng. Nhấp vào liên kết này để xem ví dụ trực tiếp trích xuất các tin tức mới nhất từ ​​quần vợt Yahoo .


2

Bạn có thể đã có nhiều như vậy, nhưng tôi nghĩ đây là những gì bạn đang cố gắng làm:

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

Tôi thích chức năng ImportXML (URL, XPath) của Google Bảng tính.

Nó sẽ lặp lại các ô xuống cột nếu biểu thức XPath của bạn trả về nhiều hơn một giá trị.

Bạn có thể có tối đa 50 importxml()chức năng trên một bảng tính.

Plugin Web của RapidMiner cũng khá dễ sử dụng. Nó có thể thực hiện các bài đăng, chấp nhận cookie và có thể đặt tác nhân người dùng .


2

Tôi cũng đã thành công khi sử dụng Jaxer + jQuery của Aptana để phân tích các trang. Về bản chất, nó không nhanh hoặc 'giống như tập lệnh', nhưng các bộ chọn jQuery + JavaScript / DOM thực là một cứu cánh trên các trang phức tạp hơn (hoặc không đúng định dạng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.