Scrape HTML Add-In là một Excel Add-In đơn giản cho phép bạn dễ dàng thu thập nội dung HTML từ các website mà không cần viết mã VBA. Hầu hết các công cụ/ add-in dùng để trích xuất dữ liệu rất phức tạp và không linh hoạt khi chỉ lấy một vài thông tin HTML đơn giản. Scrape HTML Add-In sử dụng các biểu thức chính quy thay vì XPath.
Trước khi tìm hiểu chi tiết, hãy cùng xem ví dụ để thấy việc trích title từ trang web Google dễ dàng như thế chỉ bằng cách sử dụng Add-Ins- được xây dựng thành các hàm:
Nó hoạt động như thế nào?
Dưới đây là ví dụ cho từng phần. Chức năng cốt lõi của Add-In là các hàm có sẵn trong Excel ngay sau khi Add-In được kích hoạt.
Việc kết hợp các hàm này với nhau sẽ cho phép bạn trích dẫn được hầu hết được bất kỳ nội dung nào từ website. Sử dụng hàm GetElementByRegex để trích lấy phần đầu tiên của website rồi dùng hàm GetRegex để vét đến nội dung cuối cùng. Sau đó, sử dụng hàm RegexReplace cho đầu ra.
The Add-In
Khi Add-In được kích hoạt, nó sẽ xuất hiện trong Excel ribbon như thế này:
Add-In bao gồm những đặc tính sau:
Regex Tester
Khi trích xuất dữ liệu từ trang website, thường có vấn đề xảy ra là bạn không thể xác định được các biểu thức chính quy có đúng không ngay từ ban đầu. Regex Tester cho phép bạn nhanh chóng kiểm tra từng ký tự. Công cụ này phản ứng với bất kì thay đổi nào trong các biểu thức được phê chuẩn cho văn bản được trích dẫn. Điều này giúp tiết kiệm thời gian. Hãy xem video sử dụng Regex Tester dưới đây:
Scrape HTML Tool
Các hàm Get* trích xuất những dữ liệu cụ thể từ website. Tuy nhiên, nếu bạn muốn nhanh chóng lấy được tất cả các thông tin theo một dạng nhất định thì công cụ Scrape HTML Tool sẽ rất có ích. Nó có rất nhiều các biểu thức chính quy được định nghĩa trước như là trích URLs và img src properties.
Xem video dưới đây về cách Scrape HTML Tool làm thế nào để giúp bạn:
Caching- lưu trữ trong bộ nhớ đệm
Ý tưởng chủ yếu của Add-In là giảm việc phải viết các mã VBA. Tuy nhiên, xảy ra vấn đề khi sử dụng các hàm Get* với cùng một URL bởi vì chúng sẽ quá tải khi phải download cùng một nội dung HTML nhiều lần. Điều này sẽ ảnh hưởng nghiêm trọng đến quá trình hoạt động. Để giải quyết vấn đề này, hãy sử dụng chức năng Cache- lưu trữ trong bộ nhớ đêm. Nếu bạn sử dụng cùng một URL với hơn một hàm Get* thì: với điều kiện là thời gian chờ của bộ nhớ Cache chưa hết, HTML content sẽ không bị refresh từ Web mà chỉ từ Cache. Tương tự, nếu bạn có 2 hàm Get* với cùng một URL thì trong 60s chờ, chỉ có hàm đầu tiên phải tải nội dung từ Web, trong khi hàm thứ hai không cần tải- với điều kiện là hàm thứ hai phải được gọi trước khi 60s chờ kết thúc. Bạn có thể thay đổi phần cài đặt này tại “Cache settings”.
Automatic Updating- Tự động cập nhập
Khi định file Excel để trích dẫn dữ liệu từ các websites HTML, thường có vấn đề xảy ra là làm thế nào để refresh (làm mới) dữ liệu từ web môt cách định kỳ. Ví dụ, bạn muốn lấy dữ liệu về giá cổ phiếu và refresh nó trong mỗi 2 phút. Bạn có thể làm thủ công, viết một mã VBA thông minh sử dụng chức năng Application.OnTime hay chỉ đơn giản là cài đặt chức năng refresh theo chu kỳ trong công cụ Automatic Update của Add-In.
Xem ví dụ dưới đây:
Ví dụ về trích lấy một bảng HTML
Sử dụng bảng HTML trên trang w3schools
Trích mỗi ô trong bảng vào từng ô Excel riêng biệt và điều này chỉ mất có vài phút
Thực hiện như thế nào?
Đầu tiên, hãy trích dẫn cả bảng vào ô B2 bằng cách sử dụng hàm GetElementbyRegex
=GetElementByRegex( "http://www.w3schools.com/html/html_tables.asp" ; "<table class=" "reference" " style=" "width:100%" ">([^" "]*?)</table>" ) |
Thực hiện điều này trong một ô để tối ưu workbook (trong trường hợp worksheet thực hiện tính toán lại thì nội dung này sẽ không phải tải lại riêng cho mỗi ô). Chú ý regex ([^”]*?), nó có nghĩa là không lấy tất cả các ký tự, chỉ mỗi bảng này được trích dẫn trong biểu thức chứ không phải tất cả các bảng. Sử dụng ký tự (.*)? Là không đủ bởi vì dấu chấm không thích hợp với newlines.
Tiếp theo là lấy các ô header ( lấy các header tiếp theo bằng cách thay đổi số cuối cùng từ 0-3)
=GetRegex(GetRegex($B$1; "<tr>([^" "]*?)</tr>" ;0); "<th>([^" "]*?)</th>" ;0) |
Nó lấy ra dòng đầu tiên và trích xuất thành header đầu tiên
Tương tự với các ô khác (các cột và dòng)
=GetRegex(GetRegex($B$1; "<tr>([^" "]*?)</tr>" ;1); "<td>([^" "]*?)</td>" ;0) |
Nó lấy ra dòng thứ hai và trích xuất chúng vào ô đầu tiên
Tài liệu
Tải tài liệu hoàn chỉnh tại link sau: