Tôi đã trả lời một số câu hỏi đố vui cho một cuộc phỏng vấn và câu hỏi đặt ra là tôi sẽ làm cách nào để cạo màn hình. Tức là, chọn nội dung ra khỏi trang web, giả sử bạn không có cách có cấu trúc tốt hơn để truy vấn trực tiếp thông tin (ví dụ: dịch vụ web).Cạo màn hình: biểu thức chính quy hoặc biểu thức XQuery?
Giải pháp của tôi là sử dụng biểu thức XQuery. Biểu thức khá dài vì nội dung tôi cần khá sâu trong cấu trúc phân cấp HTML. Tôi đã phải tìm kiếm thông qua tổ tiên một cách công bằng trước khi tôi tìm thấy một yếu tố với một thuộc tính id
. Ví dụ: việc cạo một trang Amazon.com cho Thứ nguyên sản phẩm trông giống như sau:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
Đó là một biểu hiện khá khó chịu, nhưng đó là lý do Amazon cung cấp API dịch vụ web. Dù sao, nó chỉ là một ví dụ. Câu hỏi không phải về Amazon, nó là về cạo màn hình.
Người phỏng vấn không thích giải pháp của tôi. Ông nghĩ rằng nó rất mong manh, bởi vì một sự thay đổi thiết kế trang của Amazon có thể yêu cầu viết lại biểu thức XQuery. Gỡ lỗi một biểu thức XQuery không khớp với bất kỳ thứ gì trong trang mà nó được áp dụng chống lại là khó.
Tôi không đồng ý với tuyên bố của ông, nhưng tôi không nghĩ giải pháp của ông là cải thiện: ông nghĩ tốt hơn là sử dụng biểu thức chính quy và tìm kiếm nội dung và đánh dấu gần trọng lượng giao hàng. Ví dụ: sử dụng Perl:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
Đối số phản đối của tôi là điều này cũng dễ bị Amazon thay đổi mã HTML của họ. Họ có thể đánh vần thẻ HTML ở thủ đô (<LI>
) hoặc thêm thuộc tính CSS hoặc thay đổi <b>
thành <span>
hoặc thay đổi nhãn "Thứ nguyên sản phẩm:" thành "Thứ nguyên:" hoặc nhiều loại thay đổi khác. Quan điểm của tôi là các biểu thức chính quy không giải quyết được các điểm yếu mà anh ta đã gọi ra trong giải pháp XQuery của tôi.
Nhưng ngoài ra, cụm từ thông dụng có thể tìm thấy các mặt tích cực sai, trừ khi bạn thêm đủ ngữ cảnh vào biểu thức. Nó cũng có thể vô tình phù hợp với nội dung xảy ra bên trong một chú thích, hoặc một chuỗi thuộc tính hoặc một phần CDATA.
Câu hỏi của tôi là, bạn sử dụng công nghệ nào để thực hiện cạo màn hình? Tại sao bạn chọn giải pháp đó? Có một số lý do thuyết phục để sử dụng nó không? Hoặc không bao giờ sử dụng khác? Có lựa chọn thứ ba nào ngoài những lựa chọn tôi đã trình bày ở trên không?
PS: Giả sử vì lý do không có API dịch vụ web hoặc cách trực tiếp khác để có được nội dung mong muốn.
Đây là lý do chính để tránh tìm kiếm trên web dựa trên XML. Không có bộ xử lý XML nào được tha thứ như một trình duyệt. Trang chỉ cần phá vỡ một quy tắc hợp lệ để làm cho XQuery hoàn toàn vô dụng. – harpo