Tôi là một fan hâm mộ lớn của Nokogiri, nhưng tại sao lại phát minh ra bánh xe?
mô-đun URI Ruby đã có extract
phương pháp để làm điều này:
URI::extract(str[, schemes][,&blk])
Từ các tài liệu:
chiết xuất URI từ một chuỗi. Nếu khối đã cho, lặp lại qua tất cả các URI được so khớp. Trả về nil nếu khối đã cho hoặc mảng có khớp.
require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:[email protected] and here also.")
# => ["http://foo.example.com/bla", "mailto:[email protected]"]
Bạn có thể sử dụng Nokogiri đi DOM và kéo tất cả các thẻ có URL, hoặc có nó lấy chỉ là văn bản và vượt qua nó để URI.extract
, hoặc chỉ để cho URI.extract
làm tất cả.
Và tại sao lại sử dụng trình phân tích cú pháp, chẳng hạn như Nokogiri, thay vì các mẫu regex?Bởi vì HTML và XML, có thể được định dạng theo nhiều cách khác nhau và vẫn hiển thị chính xác trên trang hoặc chuyển dữ liệu một cách hiệu quả. Trình duyệt rất tha thứ khi nói đến việc chấp nhận đánh dấu xấu. Mặt khác, các mẫu Regex hoạt động trong các phạm vi "chấp nhận" rất hạn chế, trong đó phạm vi được xác định bởi bạn dự đoán các biến thể trong đánh dấu như thế nào hoặc ngược lại, bạn dự đoán cách thức mô hình của mình có thể sai khi nào trình bày với các mẫu không mong muốn.
Trình phân tích cú pháp không hoạt động như một regex. Nó xây dựng một đại diện nội bộ của tài liệu và sau đó đi qua đó. Nó không quan tâm làm thế nào các tập tin/đánh dấu được đặt ra, nó hoạt động của nó trên các đại diện nội bộ của DOM. Nokogiri thư giãn phân tích cú pháp của nó để xử lý HTML, bởi vì HTML nổi tiếng vì được viết kém. Điều đó giúp chúng tôi vì hầu hết các Nokogiri HTML không xác thực có thể sửa chữa nó. Thỉnh thoảng tôi sẽ gặp phải một cái gì đó được viết một cách tồi tệ rằng Nokogiri không thể sửa chữa nó một cách chính xác, vì vậy tôi sẽ phải cho nó một cú hích nhỏ bằng cách tinh chỉnh HTML trước khi tôi chuyển nó cho Nokogiri; Tôi vẫn sẽ sử dụng trình phân tích cú pháp, thay vì cố gắng sử dụng các mẫu.
Nguồn
2011-07-16 00:13:48
Vui lòng không phân tích cú pháp HTML bằng cụm từ thông dụng, trình phân tích cú pháp HTML sẽ phục vụ bạn tốt hơn. –
@mu bạn có thể giải thích cho tôi tại sao không? –
Vì phân tích cú pháp HTML phức tạp hơn bạn có thể nghĩ và có rất nhiều HTML bị hỏng ở đó, các biểu thức thông thường đơn giản sẽ không xử lý: http://stackoverflow.com/questions/4231382/regular-expression-pattern- không phù hợp với bất cứ nơi nào trong chuỗi/4234491 # 4234491 –