Sự miêu tả
chuyển đổi JSON thành HTML có thể in
Mã trình diễn
/*// w w w. j a v a 2s .c o m * Copyright [c] 2008, ClearForest Ltd. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * - Neither the name of ClearForest Ltd. nor the names of * its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES [INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION] HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT [INCLUDING NEGLIGENCE OR OTHERWISE] * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; public class Main{ public static String convertJSONToPrintableHTML[String json] { String tab = " "; StringBuilder new_json = new StringBuilder[]; String retStr = null; int indent_level = 0; boolean in_string = false; int i; char c; json = StringUtils.escapeHTML[json]; for [i = 0; i < json.length[]; i++] { c = json.charAt[i]; switch [c] { case '{': case '[': if [!in_string] { new_json.append["" + c + "
\n" + StringUtils.strRepeat[tab, indent_level + 1]]; indent_level++; } else { new_json.append[c]; } break; case '}': case ']': if [!in_string] { indent_level--; new_json.append["
\n" + StringUtils.strRepeat[tab, indent_level] + c]; } else { new_json.append[c]; } break; case ',': if [!in_string] { new_json.append[",
\n" + StringUtils.strRepeat[tab, indent_level]]; } else { new_json.append[c]; } break; case ':': if [!in_string] { new_json.append[": "]; } else { new_json.append[c]; } break; case '&': // deal with " if [json.substring[i].startsWith["""]] { if [i == 0 || [json.charAt[i - 1] != '\\']] { in_string = !in_string; } } /* * Fall through to append the '"' */ default: new_json.append[c]; break; } } retStr = new_json.toString[]; retStr = retStr.replace["\\/", "/"]; retStr = retStr.replace[" //", "//"]; return retStr; } }
Hướng dẫn liên quan
Jsoup là một thư viện Java mã nguồn mở được sử dụng chủ yếu để trích xuất dữ liệu từ HTML. Nó cũng cho phép bạn thao tác và xuất HTML. Nó có một dòng phát triển ổn định, tài liệu tuyệt vời và API thông thạo và linh hoạt. Jsoup cũng có thể được sử dụng để phân tích cú pháp và xây dựng XML
Trong hướng dẫn này, chúng ta sẽ sử dụng Blog mùa xuân để minh họa một bài tập cạo thể hiện một số tính năng của jsoup
- Đang tải. tìm nạp và phân tích cú pháp HTML thành Tài liệu
- lọc. chọn dữ liệu mong muốn vào Phần tử và duyệt qua nó
- giải nén. lấy các thuộc tính, văn bản và HTML của các nút
- sửa đổi. thêm/chỉnh sửa/xóa các nút và chỉnh sửa các thuộc tính của chúng
2. Phụ thuộc Maven
Để sử dụng thư viện jsoup trong dự án của bạn, hãy thêm phần phụ thuộc vào tệp pom của bạn. xml
org.jsoup
jsoup
1.10.2
Bạn có thể tìm thấy phiên bản mới nhất của jsoup trong kho lưu trữ Maven Central
3. Sơ lược về Jsoup
Jsoup tải trang HTML và xây dựng cây DOM tương ứng. Cây này hoạt động giống như DOM trong trình duyệt, cung cấp các phương thức tương tự như jQuery và vanilla JavaScript để chọn, duyệt, thao tác văn bản/HTML/thuộc tính và thêm/xóa các phần tử
Nếu bạn cảm thấy thoải mái với bộ chọn phía máy khách và duyệt/thao tác DOM, bạn sẽ thấy jsoup rất quen thuộc. Kiểm tra việc in các đoạn của một trang dễ dàng như thế nào
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
Hãy nhớ rằng jsoup chỉ diễn giải HTML — nó không diễn giải JavaScript. Do đó, những thay đổi đối với DOM thường diễn ra sau khi tải trang trong trình duyệt hỗ trợ JavaScript sẽ không được nhìn thấy trong jsoup
4. Đang tải
Giai đoạn tải bao gồm tìm nạp và phân tích cú pháp HTML thành Tài liệu. Jsoup đảm bảo phân tích cú pháp của bất kỳ HTML nào, từ những trang không hợp lệ nhất đến những trang được xác thực hoàn toàn, như một trình duyệt hiện đại sẽ làm. Nó có thể đạt được bằng cách tải Chuỗi, InputStream, Tệp hoặc URL
Hãy tải một Tài liệu từ URL Blog Mùa xuân
String blogUrl = "//spring.io/blog";
Document doc = Jsoup.connect[blogUrl].get[];
Lưu ý phương thức get, nó đại diện cho một lệnh gọi HTTP GET. Bạn cũng có thể thực hiện POST HTTP bằng phương thức post [hoặc bạn có thể sử dụng phương thức nhận loại phương thức HTTP làm tham số]
Nếu bạn cần phát hiện các mã trạng thái bất thường [e. g. 404], bạn nên nắm bắt ngoại lệ HttpStatusException
try {
Document doc404 = Jsoup.connect["//spring.io/will-not-be-found"].get[];
} catch [HttpStatusException ex] {
//...
}
Đôi khi, kết nối cần được tùy chỉnh hơn một chút. Jsoup. connect[…] trả về một Kết nối cho phép bạn đặt, trong số những thứ khác, tác nhân người dùng, liên kết giới thiệu, thời gian chờ kết nối, cookie, dữ liệu bài đăng và tiêu đề
Connection connection = Jsoup.connect[blogUrl];
connection.userAgent["Mozilla"];
connection.timeout[5000];
connection.cookie["cookiename", "val234"];
connection.cookie["cookiename", "val234"];
connection.referrer["//google.com"];
connection.header["headersecurity", "xyz123"];
Document docCustomConn = connection.get[];
Vì kết nối tuân theo giao diện trôi chảy, bạn có thể xâu chuỗi các phương thức này trước khi gọi phương thức HTTP mong muốn
Document docCustomConn = Jsoup.connect[blogUrl]
.userAgent["Mozilla"]
.timeout[5000]
.cookie["cookiename", "val234"]
.cookie["anothercookie", "ilovejsoup"]
.referrer["//google.com"]
.header["headersecurity", "xyz123"]
.get[];
Bạn có thể tìm hiểu thêm về cài đặt Kết nối bằng cách duyệt Javadoc tương ứng
5. lọc
Bây giờ chúng tôi đã chuyển đổi HTML thành Tài liệu, đã đến lúc điều hướng nó và tìm thấy những gì chúng tôi đang tìm kiếm. Đây là nơi mà sự tương đồng với jQuery/JavaScript rõ ràng hơn, vì các bộ chọn và phương thức duyệt của nó là tương tự nhau
5. 1. lựa chọn
Phương thức chọn Tài liệu nhận một Chuỗi đại diện cho bộ chọn, sử dụng cú pháp bộ chọn giống như trong CSS hoặc JavaScript và truy xuất danh sách Thành phần phù hợp. Danh sách này có thể rỗng nhưng không rỗng
Chúng ta hãy xem xét một số lựa chọn bằng cách sử dụng phương pháp select
Elements links = doc.select["a"];
Elements sections = doc.select["section"];
Elements logo = doc.select[".spring-logo--container"];
Elements pagination = doc.select["#pagination_control"];
Elements divsDescendant = doc.select["header div"];
Elements divsDirect = doc.select["header > div"];
Bạn cũng có thể sử dụng các phương thức rõ ràng hơn lấy cảm hứng từ DOM của trình duyệt thay vì phương thức chọn chung chung
________số 8Vì Phần tử là lớp cha của Tài liệu, bạn có thể tìm hiểu thêm về cách làm việc với các phương thức lựa chọn trong Javadocs Tài liệu và Phần tử
5. 2. đi ngang qua
Đi ngang có nghĩa là điều hướng trên cây DOM. Jsoup cung cấp các phương thức hoạt động trên Tài liệu, trên một tập hợp Phần tử hoặc trên một Phần tử cụ thể, cho phép bạn điều hướng đến cha mẹ, anh chị em hoặc con của nút
Ngoài ra, bạn có thể chuyển đến Phần tử đầu tiên, cuối cùng và thứ n [sử dụng chỉ mục dựa trên 0] trong một tập hợp các Phần tử
Element firstSection = sections.first[];
Element lastSection = sections.last[];
Element secondSection = sections.get[2];
Elements allParents = firstSection.parents[];
Element parent = firstSection.parent[];
Elements children = firstSection.children[];
Elements siblings = firstSection.siblingElements[];
Bạn cũng có thể lặp qua các lựa chọn. Trên thực tế, mọi thứ thuộc loại Phần tử đều có thể được lặp lại
org.jsoup
jsoup
1.10.2
0Bạn có thể thực hiện lựa chọn giới hạn đối với lựa chọn trước đó [lựa chọn phụ]
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
06. giải nén
Bây giờ chúng ta đã biết cách tiếp cận các phần tử cụ thể, vì vậy đã đến lúc lấy nội dung của chúng — cụ thể là thuộc tính, HTML hoặc văn bản con của chúng
Hãy xem ví dụ này chọn bài viết đầu tiên từ blog và nhận ngày của nó, văn bản phần đầu tiên của nó và cuối cùng là HTML bên trong và bên ngoài của nó
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
1Dưới đây là một số mẹo cần ghi nhớ khi chọn và sử dụng bộ chọn
- Dựa vào tính năng “Xem nguồn” của trình duyệt của bạn và không chỉ trên trang DOM vì nó có thể đã thay đổi [chọn trong bảng điều khiển trình duyệt có thể mang lại kết quả khác với jsoup]
- Biết các bộ chọn của bạn vì có rất nhiều trong số chúng và thật tốt nếu ít nhất bạn đã nhìn thấy chúng trước đó;
- Sử dụng sân chơi cho bộ chọn để thử nghiệm với chúng [dán HTML mẫu vào đó]
- Ít phụ thuộc vào thay đổi trang. nhắm đến các bộ chọn nhỏ nhất và ít ảnh hưởng nhất [e. g. id thích hơn. dựa trên]
7. sửa đổi
Việc sửa đổi bao gồm việc thiết lập các thuộc tính, văn bản và HTML của các phần tử, cũng như thêm và xóa các phần tử. Nó được thực hiện với cây DOM được tạo trước đó bởi jsoup – Tài liệu
7. 1. Đặt thuộc tính và Văn bản bên trong/HTML
Như trong jQuery, các phương thức đặt thuộc tính, văn bản và HTML có cùng tên nhưng cũng nhận giá trị được đặt
- attr[] – đặt giá trị của thuộc tính [nó tạo thuộc tính nếu nó không tồn tại]
- text[] – đặt văn bản bên trong phần tử, thay thế nội dung
- html[] – thiết lập HTML bên trong phần tử, thay thế nội dung
Hãy xem một ví dụ nhanh về các phương pháp này
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
27. 2. Tạo và thêm các phần tử
Để thêm một phần tử mới, trước tiên bạn cần xây dựng phần tử đó bằng cách khởi tạo Phần tử. Khi Phần tử đã được tạo, bạn có thể nối nó vào Phần tử khác bằng phương thức appendChild. Phần tử mới được tạo và nối thêm sẽ được chèn vào cuối phần tử nơi appendChild được gọi
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
37. 3. Loại bỏ các yếu tố
Để xóa các phần tử, trước tiên bạn cần chọn chúng và chạy phương thức xóa
For example, let's remove all
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
47. 4. Chuyển đổi tài liệu đã sửa đổi thành HTML
Cuối cùng, vì chúng tôi đang thay đổi Tài liệu, chúng tôi có thể muốn kiểm tra công việc của mình
Để làm điều này, chúng ta có thể khám phá cây Document DOM bằng cách chọn, duyệt qua và trích xuất bằng các phương thức được trình bày hoặc chúng ta có thể chỉ cần trích xuất HTML của nó dưới dạng Chuỗi bằng phương thức html[]
Document doc = Jsoup.connect["//example.com"].get[];
doc.select["p"].forEach[System.out::println];
5Đầu ra Chuỗi là một HTML gọn gàng
8. Phần kết luận
Jsoup là một thư viện tuyệt vời để cạo bất kỳ trang nào. Nếu bạn đang sử dụng Java và không yêu cầu cạo dựa trên trình duyệt, thì đó là một thư viện cần tính đến. Nó quen thuộc và dễ sử dụng vì nó sử dụng kiến thức bạn có thể có về phát triển giao diện người dùng và tuân theo các mẫu thiết kế và thực tiễn tốt
Bạn có thể tìm hiểu thêm về cách quét các trang web bằng jsoup bằng cách nghiên cứu API jsoup và đọc sách dạy nấu ăn jsoup