Các thư viện python chuyên dụng như Inscriptis và HTML2Text cung cấp chất lượng và tốc độ hội thoại tốt, mặc dù bạn có thể thích giải quyết bằng lxml hoặc BeautifulSoup, đặc biệt nếu bạn đã sử dụng các thư viện này trong chương trình của mình
thư viện
Đoạn mã bên dưới minh họa mã cần thiết để chuyển đổi HTML thành văn bản với inscriptis, html2text, BeautifulSoup và lxml
# inscriptis
from inscripits import get_text
text = get_text[html_content]
# html2text
from html2text import HTML2Text
h = HTML2Text[]
text = h.handle[html_content]
# beautifulsoup
from bs4 import BeautifulSoup
soup = BeautifulSoup[html_content]
text = soup.get_text[]
# lxml
import lxml.html import fromstring
from lxml.html.clean import clean_html
doc = fromstring[html_content]
text = clean_html[doc].text_content[]
Trình duyệt web dựa trên bảng điều khiển
Một tùy chọn phổ biến khác là gọi trình duyệt web dựa trên bảng điều khiển như lynx và w3m để thực hiện chuyển đổi, mặc dù phương pháp này yêu cầu cài đặt các chương trình này trên hệ thống của người dùng
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
Chọn cách tiếp cận tốt nhất cho bạn
Có một số tiêu chí bạn nên xem xét khi chọn phương pháp chuyển đổi
- HTML phức tạp đến mức nào để phân tích cú pháp và bạn có loại yêu cầu nào đối với chất lượng chuyển đổi?
- bạn quan tâm đến toàn bộ trang hay chỉ ở dạng phân số [e. g. , văn bản bài viết, bài đăng trên diễn đàn hoặc bảng] của nội dung?
- ngữ nghĩa và/hoặc cấu trúc của tệp HTML có cung cấp thông tin có giá trị cho vấn đề của bạn không [e. g. , văn bản được nhấn mạnh để tự động tạo tóm tắt văn bản]?
Chất lượng chuyển đổi
Chất lượng chuyển đổi trở thành một yếu tố khi bạn cần vượt ra ngoài các đoạn mã HTML đơn giản. Các phương pháp tiếp cận không chuyên biệt không giải thích chính xác ngữ nghĩa HTML và do đó, không thể chuyển đổi đúng các cấu trúc như mục hóa, liệt kê và bảng
Ví dụ: BeautifulSoup và lxml, chuyển đổi bảng liệt kê HTML sau thành chuỗi
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
5
first
second
Ngược lại, HTML2Text, Inscriptis và các trình duyệt dựa trên bảng điều khiển trả về kết quả chính xác
* first
* second
Nhưng ngay cả các thư viện chuyên ngành cũng có thể cung cấp các chuyển đổi không chính xác tại một số điểm. Ví dụ, HTML2Text thực hiện khá tốt việc diễn giải HTML nhưng không thành công khi tài liệu HTML trở nên quá phức tạp. Chẳng hạn, các bảng HTML phức tạp hơn thường được sử dụng trên Wikipedia sẽ trả về các biểu diễn văn bản không còn phản ánh đúng quan hệ không gian giữa các đoạn văn bản như được nêu trong ví dụ bên dưới
Đoạn mã Wikipedia được chuyển đổi bằng Inscriptis. Xin lưu ý rằng Inscriptis chỉ bao bọc các dòng đầu vào, nếu ngữ nghĩa của tài liệu HTML yêu cầu điều nàyChur has an oceanic climate in spite of its inland position. Summers are warm and sometimes hot, normally averaging around 25 °C [77 °F] during the day, whilst winter means are around freezing, with daytime temperatures being about 5 °C [41 °F]. Between 1981 and 2010 Chur had an average of 104.6 days of rain per year and on average received 849 mm [33.4 in] of precipitation. The wettest month was August during which time Chur received an average of 112 mm [4.4 in] of precipitation. During this month there was precipitation for an average of 11.2 days. The driest month of the year was February with an average of 47 mm [1.9 in] of precipitation over 6.6 days.[19]
Climate data for Chur [1981-2010]
Month Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Year
Average high °C [°F] 4.8 6.4 11.2 15.1 20.0 22.7 24.9 24.1 20.0 16.1 9.5 5.3 15.0
[40.6] [43.5] [52.2] [59.2] [68.0] [72.9] [76.8] [75.4] [68.0] [61.0] [49.1] [41.5] [59.0]
Daily mean °C [°F] 0.7 1.8 5.9 9.7 14.3 17.1 19.1 18.5 14.8 10.8 5.2 1.7 10.0
[33.3] [35.2] [42.6] [49.5] [57.7] [62.8] [66.4] [65.3] [58.6] [51.4] [41.4] [35.1] [50.0]
Average low °C [°F] −2.6 −2.0 1.6 4.6 8.9 11.8 13.8 13.7 10.3 6.6 1.7 −1.4 5.6
[27.3] [28.4] [34.9] [40.3] [48.0] [53.2] [56.8] [56.7] [50.5] [43.9] [35.1] [29.5] [42.1]
Average precipitation mm [inches] 51 47 55 49 71 93 109 112 81 56 70 55 849
[2.0] [1.9] [2.2] [1.9] [2.8] [3.7] [4.3] [4.4] [3.2] [2.2] [2.8] [2.2] [33.4]
Average snowfall cm [inches] 34.0 24.7 10.3 1.5 0.4 0.0 0.0 0.0 0.1 0.1 10.0 20.6 101.7
[13.4] [9.7] [4.1] [0.6] [0.2] [0.0] [0.0] [0.0] [0.0] [0.0] [3.9] [8.1] [40.0]
Average precipitation days [≥ 1.0 mm] 7.3 6.6 8.1 7.5 9.9 11.2 11.0 11.2 8.4 7.0 8.5 7.9 104.6
Average snowy days [≥ 1.0 cm] 4.8 3.9 2.5 0.4 0.1 0.0 0.0 0.0 0.0 0.0 1.6 4.1 17.4
Average relative humidity [%] 73 70 65 63 64 67 68 71 73 73 74 75 70
Mean monthly sunshine hours 97 112 139 147 169 177 203 185 155 135 93 81 1,692
Source: MeteoSwiss[19]
Đoạn mã tương tự được chuyển đổi bằng HTML2Text bằng cài đặt mặc định
Chur has an [oceanic climate][/wiki/Oceanic_climate "Oceanic climate"] in
spite of its inland position. Summers are warm and sometimes hot, normally
averaging around 25 °C [77 °F] during the day, whilst winter means are around
freezing, with daytime temperatures being about 5 °C [41 °F]. Between 1981 and
2010 Chur had an average of 104.6 days of rain per year and on average
received 849 mm [33.4 in] of
[precipitation][/wiki/Precipitation_\[meteorology\] "Precipitation
\[meteorology\]"].
The wettest month was August during which time Chur
received an average of 112 mm [4.4 in] of precipitation. During this month
there was precipitation for an average of 11.2 days. The driest month of the
year was February with an average of 47 mm [1.9 in] of precipitation over 6.6
days.[19]
Climate data for Chur [1981-2010]
---
Month | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct |
Nov | Dec | Year
Average high °C [°F] | 4.8
[40.6] | 6.4
[43.5] | 11.2
[52.2] | 15.1
[59.2] | 20.0
[68.0] | 22.7
[72.9] | 24.9
[76.8] | 24.1
[75.4] | 20.0
[68.0] | 16.1
[61.0] | 9.5
[49.1] | 5.3
[41.5] | 15.0
[59.0]
Daily mean °C [°F] | 0.7
[33.3] | 1.8
[35.2] | 5.9
[42.6] | 9.7
[49.5] | 14.3
[57.7] | 17.1
[62.8] | 19.1
[66.4] | 18.5
[65.3] | 14.8
[58.6] | 10.8
[51.4] | 5.2
[41.4] | 1.7
[35.1] | 10.0
[50.0]
Văn bản HTML2 không diễn giải chính xác sự liên kết của các giá trị nhiệt độ trong bảng và do đó, không duy trì được vị trí không gian của các thành phần văn bản
Ngược lại, Inscriptis đã được tối ưu hóa để cung cấp các biểu diễn văn bản chính xác và thậm chí xử lý các phần tử xếp tầng [e. g. , bảng xếp tầng, mục hóa trong bảng, v.v. ] và một số thuộc tính CSS có liên quan đến việc căn chỉnh nội dung. Nếu nói đến việc phân tích các cấu trúc như vậy, nó thường cung cấp các chuyển đổi thậm chí còn chính xác hơn so với trình duyệt lynx dựa trên văn bản
Nếu bạn cần diễn giải các trang Web và JavaScript thực sự phức tạp, bạn có thể cân nhắc sử dụng Selenium cho phép bạn điều khiển từ xa các Trình duyệt web tiêu chuẩn như Google Chrome và Firefox từ Python. Xin lưu ý rằng giải pháp này có những nhược điểm đáng kể về độ phức tạp, yêu cầu tài nguyên, khả năng mở rộng và tính ổn định
Chỉ trích xuất nội dung có liên quan
Việc loại bỏ các phần tử nhiễu trong các trang Web [thường được ký hiệu là bản soạn sẵn] là một vấn đề phổ biến khác. Ví dụ, một trang tin tức điển hình chứa các yếu tố điều hướng, thông tin về các bài báo liên quan, quảng cáo, v.v. thường không liên quan đến các nhiệm vụ khai thác tri thức
Đối với các ứng dụng như vậy, tồn tại phần mềm chuyên dụng, chẳng hạn như jusText, dragnet và boilerpy3 chỉ nhằm mục đích trích xuất nội dung có liên quan. Adrien Barbaresi đã viết một bài báo xuất sắc về chủ đề này cũng đánh giá một số phương pháp trích xuất văn bản được sử dụng phổ biến nhất. Ngoài các phương pháp trích xuất nội dung chung, còn có các thư viện chuyên biệt xử lý một số loại trang Web. Chẳng hạn, bộ công cụ Thu hoạch đã được tối ưu hóa để trích xuất các bài đăng và siêu dữ liệu bài đăng từ các diễn đàn Web và vượt trội hơn các phương pháp tiếp cận không chuyên biệt cho nhiệm vụ này
Chuyển đổi bảng thành Pandas Dataframes
Nếu bạn cần thao tác trên dữ liệu trong các bảng HTML, bạn có thể xem xét hàm
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
6 của gấu trúc trả về danh sách các khung dữ liệu cho tất cả các bảng trong nội dung HTML________số 8
Giữ nguyên cấu trúc và ngữ nghĩa HTML với các chú thích
Trước đây, tôi thường tình cờ gặp các ứng dụng mà một số cấu trúc và ngữ nghĩa được mã hóa trong tài liệu HTML gốc sẽ hữu ích cho các tác vụ xuôi dòng. Với việc phát hành Inscriptis 2. 0, Inscriptis hỗ trợ cái gọi là quy tắc chú thích, cho phép trích xuất siêu dữ liệu bổ sung từ tệp HTML
Ví dụ bên dưới cho thấy cách các chú thích này hoạt động khi phân tích cú pháp đoạn mã HTML sau được lưu trữ trong tệp
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
7import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
0Từ điển
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
8 trong mã bên dưới ánh xạ các thẻ, thuộc tính và giá trị HTML tới siêu dữ liệu do người dùng chỉ định sẽ được đính kèm với các đoạn văn bản phù hợpimport subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
2Các quy tắc chú thích được sử dụng trong phương thức
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
9 của Inscriptis trả về một từ điển của văn bản được trích xuất và một danh sách các chú thích tương ứngimport subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
4Một bộ vị trí bắt đầu và kết thúc trong văn bản được trích xuất và siêu dữ liệu tương ứng mô tả từng chú thích. Ví dụ: trong ví dụ trên, bốn chữ cái đầu tiên của văn bản được chuyển đổi [tham chiếu đến thuật ngữ
first
second
0] chứa nội dung ban đầu được đánh dấu bằng thẻ
first
second
1 được chú thích bằng
first
second
2 và
first
second
1. Các chú thích này có thể được sử dụng sau này trong ứng dụng của bạn hoặc bằng phần mềm của bên thứ ba như doccano có thể nhập và trực quan hóa nội dung được chú thích JSONL [xin lưu ý rằng doccano hiện không hỗ trợ các chú thích chồng chéo]
first
second
4 đi kèm với ứng dụng khách dòng lệnh
first
second
5 có khả năng hậu xử lý nội dung được chú thích và chuyển đổi nó thành [i] XML, [ii] danh sách các biểu mẫu bề mặt và siêu dữ liệu [i. e. , văn bản đã được chú thích] và [iii] để trực quan hóa nội dung được chuyển đổi và chú thích trong tài liệu HTML- Trích xuất các dạng bề mặt bằng cách sử dụng
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
0
first
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
1ngăn xếp chồng lên nhau
Việc xuất HTML của trang Stackoverflow được chú thích sử dụng các quy tắc chú thích sau để chú thích các tiêu đề, nội dung được nhấn mạnh, mã và thông tin về người dùng và nhận xét
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
2Tệp HTML tương ứng đã được tạo bằng ứng dụng khách dòng lệnh
first
second
5 và các tham số dòng lệnh sauimport subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
3Wikipedia
Ví dụ thứ hai hiển thị một đoạn trích của trang Wikipedia đã được chú thích với các quy tắc bên dưới
import subprocess
# call lynx to perform the conversion
text = subprocess.check_output[['lynx', '-dump', url]]
text = text.decode['utf8']
# use w3m instead
text = subprocess.check_output[['w3m', '-dump', url]]
text = text.decode['utf8']
4Một số lưu ý cuối cùng
Inscriptis đã được tối ưu hóa để cung cấp các biểu diễn chính xác của các tài liệu HTML thường ngang bằng hoặc thậm chí vượt qua chất lượng của các trình duyệt Web dựa trên bảng điều khiển như Lynx và w3m. Nếu điều này là không đủ cho các ứng dụng của bạn [e. g. , vì bạn cũng cần JavaScript], bạn có thể cân nhắc sử dụng Selenium, sử dụng Chrome hoặc Firefox để thực hiện chuyển đổi. Rõ ràng tùy chọn này sẽ yêu cầu nhiều tài nguyên hơn đáng kể, quy mô kém hơn và được coi là kém ổn định hơn so với việc sử dụng các phương pháp nhẹ
Xin lưu ý rằng tôi là tác giả của Inscriptis và đương nhiên bài viết này tập trung nhiều hơn vào các tính năng mà nó cung cấp. Tuy nhiên, tôi cũng đã sử dụng thành công HTML2Text, lxml, BeautifulSoup, Lynx và w3m trong công việc của mình và tất cả những công cụ này đều là những công cụ rất có khả năng xử lý nhiều tình huống ứng dụng trong thế giới thực