Golang giải mã html

Có thể bạn đã nghe và đọc hàng chục câu chuyện về tướng trong Go about normal slice và maps nhưng vẫn chưa nghĩ ra cách thú vị để áp dụng tính năng này. Hãy triển khai đồng đẳng của gấu trúc. read_html, ánh xạ các bảng HTML thành các lát cấu trúc. Nếu nó có thể đạt được ngay cả với Rust, thì tại sao lại không thể với Go?. Bài tiểu luận này sẽ cho bạn thấy sự kết hợp thú vị giữa phản ánh và khái quát để đạt được các API bên ngoài ngắn gọn cho thư viện của bạn

Trước tiên, hãy xem nguồn cảm hứng trực tiếp cho bài viết này — thư viện phân tích dữ liệu tương tác phổ biến nhất, Pandas. Đọc HTML dường như phổ biến đến mức nó được coi là hàng hóa và do đó, hoạt động vượt trội

Ví dụ về việc sử dụng gấu trúc. read_html từ Máy tính xách tay Jupyter

Để làm theo ví dụ về phân tích cú pháp bảng thành ngữ, hãy nhằm mục đích lấy danh sách S&P 500 từ Wikipedia và biến nó thành một lát gồm các trường hợp Ticker, trong đó chúng tôi chú thích từng cột bằng tên tiêu đề bảng

Mọi thứ thậm chí có thể ngắn gọn trong Go

Một cái gì đó mà chúng tôi sẽ chú ý ở đây sẽ là [Ticker] từ NewSliceFromURL[Ticker][URL]. đi này. Tính năng 18+ được gọi là tham số loại là cách thú vị của chúng tôi để nói với NewSliceFromURL tên của loại, trong đó sự phản chiếu sẽ hỗ trợ chúng tôi khám phá tên của các tiêu đề. Trước thuốc generic, bạn có thể đã viết một API tương tự như NewSliceFromURL[Ticker{}, URL], mặc dù tôi luôn thấy nó hơi khó hiểu

Tại sao chúng ta cần truyền thể hiện trống của loại nếu mục tiêu của chúng ta chỉ truyền loại đó?

Sau nhiều năm viết mã Java, tôi đã quen với khái niệm “ánh xạ đối tượng” từ các thư viện như Jackson. Nhưng blog này viết về cờ vây và có lẽ bạn đã đến đây để tìm ra cách đạt được điều tương tự. Bạn có thể đã cho rằng các sản phẩm chung của Go “chỉ hoạt động”, nhưng mức độ thích thú của bạn phụ thuộc vào mối quan hệ của bạn với các hệ sinh thái lập trình khác. Tính đến thời điểm viết bài này, các phương thức chưa thể có tham số kiểu, điều này “mở ra cánh cửa sáng tạo” cho thiết kế API. Đây là hình minh họa

Loại bỏ nhu cầu về API công khai để khởi tạo cấu trúc trống với tham số loại

Nó trông hơi giống ma thuật, nhưng đây là cách nghĩ đơn giản về nó. Khi chúng ta gọi theNewSliceFromURL[Ticker][], trình biên dịch sẽ thay thế các tham chiếu tham số loại bằng loại thực tế và dummy T trong loại feeder[T] trở thành dummy Ticker. Vẫn khó theo dõi, nhưng ly kỳ?

Vì vậy, bây giờ chúng ta có một dummy Ticker và cần đọc một số siêu dữ liệu từ nó. Đầu tiên, chúng tôi lấy Ticker1 từ dummy Ticker của chúng tôi, sau đó chúng tôi đưa loại Ticker3 vào biến Ticker4, từ đó chúng tôi có thể khám phá số lượng trường của một loại và lặp lại chúng

Bây giờ chúng ta cần liên kết các trường Ticker với tiêu đề bảng. Trong Java, có lẽ bạn đã tạo chú thích Ticker5 và sử dụng toàn bộ khung có cấu trúc xung quanh nó

Tuy nhiên, trong Go, người ta phải tuân theo một quy ước trong đó và viết “chuỗi thẻ” gồm các cặp Ticker6 được phân tách bằng dấu cách tùy chọn, mà chúng ta có thể đọc thông qua phương thức Ticker7 của thuộc tính Ticker8 của trường struct

Phân tích cú pháp điển hình của bạn về thẻ trường cấu trúc

Khi chúng tôi có ánh xạ vị trí trường cấu trúc, chúng tôi phải khớp nó với các vị trí cột tiêu đề của bảng, điều mà chúng tôi sẽ thảo luận sau trong bài đăng này

Kết hợp những gì cấu trúc của chúng tôi hiểu với những gì có trong bảng HTML

Tất cả ánh xạ và dữ liệu đều ở đó và chúng tôi đã sẵn sàng để phản ánh nó trên một lát chúng tôi tạo. Các bit thú vị ở đây liên quan đến việc tạo một lát cắt và chuyển lát cắt này thành một loại bê tông

Cho rằng chúng tôi đã có tất cả dữ liệu bảng trong bộ nhớ, chúng tôi có thể Ticker9 với dung lượng và độ dài được xác định trước để tránh sự phát triển động không cần thiết của lát cắt. Ticker9 trả về một giá trị lát cắt mà chúng tôi sẽ sử dụng để truy cập các mục riêng lẻ với lát cắt theo vị trí của chúng

Đoạn mã này giả sử chuỗi là loại dữ liệu được hỗ trợ duy nhất cho các ô trong bảng của chúng tôi. Khi chúng tôi đã thêm tất cả các hàng của bảng vào lát cắt của mình, chúng tôi phải truyền nó. Phương pháp [Ticker]1 sẽ chuyển đổi giá trị phản ánh thành [Ticker]2 và [Ticker]3 sẽ cho chúng ta [Ticker]4

phản chiếu. MakeSlice[] tạo một giá trị nơi bạn thêm các phần tử mới thông qua phương thức Index[]

Và API tuyệt đẹp mà bạn đã thấy ở đầu trang được hỗ trợ bởi hàm gói đã xuất sau đây, hàm này chỉ chịu trách nhiệm truyền bá tham chiếu kiểu bởi trình biên dịch và gọi trình khởi tạo cho một số thứ

Trình bao bọc mức gói là cần thiết để che giấu sự phức tạp của các biến giả

Nhớ. không giống như sự phản chiếu trong các ngôn ngữ khác, bạn đề cập đến một trường theo vị trí của nó trong cấu trúc, không phải tên. Thứ tự trường đôi khi ảnh hưởng đến hiệu suất, nhưng chúng tôi đang sử dụng phản ánh ở đây, vì vậy dù sao thì hiệu suất cũng bị ảnh hưởng đôi chút

Nhưng trong trường hợp này, nó ít quan trọng hơn sự rõ ràng của API công khai

Tóm lại. Bất cứ khi nào chúng tôi làm việc với các lớp được chú thích, chúng tôi phải phân tích các trường được chú thích

Bây giờ chúng ta đã chơi với sự phản chiếu đủ rồi, hãy lấy một số dữ liệu. Bạn cũng có thể có xu hướng sử dụng một bảng mà không cần tạo bất kỳ loại tùy chỉnh nào và sử dụng các lệnh gọi lại cũ đơn giản. Là tác giả thư viện, bạn có thể thêm các phương thức như [Ticker]5, [Ticker]6, [Ticker]7, v.v. Nó phổ biến đối với Java với quá tải phương thức. Chỉ cần nhìn vào các nguồn log4j. Nhưng đối với GoLang, chúng ta phải trò chuyện vui vẻ

Các cuộc gọi lại cũ đơn giản để lặp lại

Định tuyến dữ liệu vào cuộc gọi lại tương đối đơn giản vì chúng ta chỉ cần tìm ra vị trí của tiêu đề bảng và khớp nó với các tên cột được cung cấp. Cụ thể hơn phương pháp phản chiếu, nhưng nó chỉ chia tỷ lệ thành một vài cột. Bạn không muốn duy trì quá nhiều phương thức dài dòng trong một loại duy nhất và để đơn giản, chúng tôi sẽ chỉ có [Ticker]5, [Ticker]6 và [Ticker]7

Duy trì các API ngắn gọn và lan truyền lỗi trong Go yêu cầu gần như sao chép-dán

Làm cách nào để chúng tôi biết nên chọn bảng nào trên trang HTML? . Và thư viện Pandas đã không giải quyết đủ tốt vấn đề “trải nghiệm của nhà phát triển”. Vì vậy, hãy thêm một số kinh nghiệm đơn giản của các bảng phù hợp theo tên cột. Nó sẽ hoạt động trong 99% trường hợp vì các trang có bảng dưới dạng dữ liệu trung bình có một thẻ bảng, đôi khi là hai và hiếm khi là ba. Đó là thập kỷ thứ hai của thế kỷ XXI và hầu như không ai sử dụng HTML cho bố cục

Thông báo lỗi lớn là điều cần thiết để khớp mờ

Chúng tôi lấy dữ liệu bảng ở mức thấp nhất thông qua gói NewSliceFromURL[Ticker][URL]1 bằng cách tạo trình phân tích cú pháp đệ quy đơn giản. Tất nhiên, chúng tôi có thể làm điều đó với NewSliceFromURL[Ticker][URL]2 [cũng được xây dựng trên NewSliceFromURL[Ticker][URL]3], nhưng chúng tôi có thể làm cho mã đơn giản hơn bằng cách tránh hai phụ thuộc bắc cầu bổ sung. Nếu bạn, với tư cách là khán giả, quan tâm đến việc viết bài so sánh kỹ thuật - vui lòng để lại nhận xét bên dưới và tôi sẽ xem chúng ta có thể làm gì

Chủ Đề