from pretty_html_table import build_table
html_table_blue_light = build_table[pd.read_excel['df.xlsx'], 'blue_light']
send_email[account
, 'test@any.com'
, 'test table'
, start
, html_table_blue_light
, end
]
5 tồn tại để chuyển đổi DataFrame của gấu trúc thành một bảng html đẹp mắt để sử dụng trong email. Đối tượng mục tiêu dự định là bất kỳ ai cần gửi báo cáo qua email và muốn làm cho bảng của họ trông hấp dẫn hơn12 chủ đề màu sắc khác nhau có sẵn. Đầu ra của gói nhúng độc đáo với các gói khác được sử dụng để gửi email html, chẳng hạn như email hoặc O365. Định dạng html được đặt ở cấp hàng DataFrame, cho phép gần như mọi nhà cung cấp dịch vụ email phân tích nó. Điều này làm giảm nhu cầu tìm hiểu cách CSS có thể tương tác với nhà cung cấp dịch vụ gửi/nhận email
Sử dụng
from pretty_html_table import build_table
html_table_blue_light = build_table[pd.read_excel['df.xlsx'], 'blue_light']
send_email[account
, 'test@any.com'
, 'test table'
, start
, html_table_blue_light
, end
]
6 để cài đặt góipip install pretty_html_table
Một ví dụ đơn giản để tải tệp Excel vào DataFrame của gấu trúc, chuyển đổi nó thành html và sau đó lưu vào tệp html
from pretty_html_table import build_table
df = pd.read_excel['df.xlsx']
html_table_blue_light = build_table[df, 'blue_light']
# Save to html file
with open['pretty_table.html', 'w'] as f:
f.write[html_table_blue_light]
# Compare to the pandas .to_html method:
with open['pandas_table.html', 'w'] as f:
f.write[df.to_html[]]
Sử dụng bất kỳ trình duyệt nào để mở
from pretty_html_table import build_table
html_table_blue_light = build_table[pd.read_excel['df.xlsx'], 'blue_light']
send_email[account
, 'test@any.com'
, 'test table'
, start
, html_table_blue_light
, end
]
7 để xem bảng sẽ xuất hiện như thế nào trong email htmlTại sao chọn pretty_html_table?
Đầu ra đã sẵn sàng để được gửi qua bất kỳ gói Python nào được sử dụng để gửi email. Chèn kết quả của gói này vào phần thân của email và voila
Danh sách các màu có sẵn
TênKiểu phông chữHeaderRows'blue_light'Century GothicBold. có / Màu nền. trắng / Màu chữ. màu xanh đậm Màu nền lạ. xanh nhạt / Màu nền đều. white'blue_dark'Century GothicBold. có / Màu nền. xanh đậm / Màu chữ. màu nền trắngLẻ. xanh nhạt / Màu nền đều. white'grey_light'Century GothicBold. có / Màu nền. trắng / Màu chữ. màu xám đậmMàu nền lạ. xám nhạt / Màu nền đều. white'grey_dark'Century GothicBold. có / Màu nền. màu xám đậm / Màu chữ. màu nền trắngLẻ. xám nhạt / Màu nền đều. white'orange_light'Century GothicBold. có / Màu nền. trắng / Màu chữ. cam đậm Màu nền lạ. cam nhạt / Màu nền đều. white'orange_dark'Century GothicBold. có / Màu nền. cam đậm / Màu chữ. màu nền trắngLẻ. cam nhạt / Màu nền đều. white'yellow_light'Century GothicĐậm. có / Màu nền. trắng / Màu chữ. vàng đậm Màu nền lạ. vàng nhạt / Màu nền đều. trắng'vàng_tối'Century GothicBold. có / Màu nền. màu vàng đậm / Màu chữ. màu nền trắngLẻ. vàng nhạt / Màu nền đều. white'green_light'Century GothicĐậm. có / Màu nền. trắng / Màu chữ. xanh đậm Màu nền lạ. xanh nhạt / Màu nền đều. white'green_dark'Century GothicBold. có / Màu nền. xanh đậm / Màu chữ. màu nền trắngLẻ. xanh nhạt / Màu nền đều. white'red_light'Century GothicBold. có / Màu nền. trắng / Màu chữ. màu đỏ sẫm Màu nền lạ. đỏ nhạt / Màu nền đều. white'red_dark'Century GothicBold. có / Màu nền. màu đỏ đậm / Màu chữ. màu nền trắngLẻ. đỏ nhạt / Màu nền đều. trắngVí dụ về tích hợp với gói O365
Đầu tiên, tạo một chức năng để gửi email
from O365 import Account
# Never hard code credentials or store them in a repo
# Use environmental variables instead
credentials = [o365credid, o365credpwd]
account = Account[credentials]
def send_email[account, to, subject, start, body, end]:
m = account.new_message[]
m.to.add[to]
m.subject = subject
m.body = start + body + end
m.send[]
Sau đó tạo phần đầu và phần cuối của email trong html
start = """
Data table here:
"""
end = """
"""
Cuối cùng, chúng tôi có thể sử dụng ________ 48 để chuyển đổi tệp Excel của bạn và gửi email
from pretty_html_table import build_table
html_table_blue_light = build_table[pd.read_excel['df.xlsx'], 'blue_light']
send_email[account
, 'test@any.com'
, 'test table'
, start
, html_table_blue_light
, end
]
Đây là tất cả các màu hiện có
Đối số bổ sung
Một số đối số tùy chọn hiện tồn tại cho phép người dùng kiểm soát phông chữ, cỡ chữ và căn chỉnh của bảng
Rất phổ biến để chạy vào các bảng HTML trong khi quét một trang web và nếu không có cách tiếp cận phù hợp, có thể hơi khó để trích xuất dữ liệu nhất quán, hữu ích từ chúng
Trong bài viết này, bạn sẽ thấy cách thực hiện việc loại bỏ nhanh chóng, hiệu quả các yếu tố này bằng hai cách tiếp cận chính khác nhau. chỉ sử dụng thư viện Pandas và sử dụng thư viện cạo truyền thống BeautifulSoup
Ví dụ tôi cạo bảng phân loại Premier League. Điều này là tốt bởi vì nó là một bảng phổ biến có thể được tìm thấy trên bất kỳ trang web thể thao nào về cơ bản. Mặc dù thật hợp lý khi thông báo cho bạn điều này, nhưng bảng bị xóa sẽ không tạo ra nhiều khác biệt khi bạn đọc vì tôi đã cố gắng làm cho bài viết này tổng quát nhất có thể
gấu trúc. read_html[]. lối tắtNếu tất cả những gì bạn muốn là lấy một số bảng từ một trang và không có gì khác, thì bạn thậm chí không cần phải thiết lập toàn bộ trình quét để làm điều đó vì Pandas có thể tự hoàn thành công việc này. Hàm
df = dfs[4]
1 sử dụng một số thư viện trích xuất như BeautifulSoup và Urllib để trả về danh sách chứa tất cả các bảng trong một trang dưới dạng DataFrames. Bạn chỉ cần chuyển URL của trangdfs = pd.read_html[url]
Tất cả những gì bạn cần làm bây giờ là chọn DataFrame bạn muốn từ danh sách này
df = dfs[4]
Nếu bạn không chắc chắn về thứ tự của các khung trong danh sách hoặc nếu bạn không muốn mã của mình dựa vào thứ tự này [các trang web có thể thay đổi], bạn luôn có thể tìm kiếm DataFrames để tìm thứ bạn đang tìm kiếm
________số 8… hoặc theo tên cột của nó chẳng hạn
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
Nhưng Pandas vẫn chưa hoàn thành việc làm cho cuộc sống của chúng ta dễ dàng hơn. Hàm này chấp nhận một số đối số hữu ích để giúp bạn có được bảng phù hợp. Bạn có thể sử dụng
df = dfs[4]
2 để chỉ định một chuỗi o regex mà bảng phải khớp; Tuy nhiên, nếu bạn không chỉ cạo các bảng và đang sử dụng, giả sử, Yêu cầu lấy trang, thì bạn nên chuyển
df = dfs[4]
5 cho hàm thay vì URLfrom pretty_html_table import build_table
df = pd.read_excel['df.xlsx']
html_table_blue_light = build_table[df, 'blue_light']
# Save to html file
with open['pretty_table.html', 'w'] as f:
f.write[html_table_blue_light]
# Compare to the pandas .to_html method:
with open['pandas_table.html', 'w'] as f:
f.write[df.to_html[]]
4Điều tương tự cũng xảy ra nếu bạn đang sử dụng Selenium webdriver để truy cập trang
from pretty_html_table import build_table
df = pd.read_excel['df.xlsx']
html_table_blue_light = build_table[df, 'blue_light']
# Save to html file
with open['pretty_table.html', 'w'] as f:
f.write[html_table_blue_light]
# Compare to the pandas .to_html method:
with open['pandas_table.html', 'w'] as f:
f.write[df.to_html[]]
5Đó là bởi vì bằng cách này, bạn sẽ giảm đáng kể thời gian mã của bạn chạy vì hàm
df = dfs[4]
6 không cần lấy trang nữa. Kiểm tra thời gian trung bình trôi qua cho một trăm lần lặp lại trong mỗi tình huốngfrom pretty_html_table import build_table
df = pd.read_excel['df.xlsx']
html_table_blue_light = build_table[df, 'blue_light']
# Save to html file
with open['pretty_table.html', 'w'] as f:
f.write[html_table_blue_light]
# Compare to the pandas .to_html method:
with open['pandas_table.html', 'w'] as f:
f.write[df.to_html[]]
7Việc sử dụng URL làm cho mã chậm hơn khoảng ba lần. Vì vậy, sẽ chỉ hợp lý khi sử dụng nó nếu bạn không lấy trang trước bằng các thư viện khác
Mặc dù Pandas thực sự tuyệt vời nhưng nó không giải quyết được tất cả các vấn đề của chúng tôi. Sẽ có lúc bạn cần cạo một phần tử của bảng một cách khôn ngoan, có thể vì bạn không muốn toàn bộ bảng hoặc vì cấu trúc của bảng không nhất quán hoặc vì bất kỳ lý do nào khác
Để giải quyết vấn đề đó, trước tiên chúng ta cần hiểu cấu trúc chuẩn của bảng HTML
from pretty_html_table import build_table
df = pd.read_excel['df.xlsx']
html_table_blue_light = build_table[df, 'blue_light']
# Save to html file
with open['pretty_table.html', 'w'] as f:
f.write[html_table_blue_light]
# Compare to the pandas .to_html method:
with open['pandas_table.html', 'w'] as f:
f.write[df.to_html[]]
8Trong đó
df = dfs[4]
7 là viết tắt của “table row”, df = dfs[4]
8 là viết tắt của “table header” và df = dfs[4]
9 là viết tắt của “table data”, là nơi lưu trữ dữ liệu dưới dạng văn bảnMẫu này thường hữu ích, vì vậy tất cả những gì chúng ta phải làm là chọn các phần tử chính xác bằng cách sử dụng BeautifulSoup
Điều đầu tiên cần làm là tìm bảng. Phương thức
for df in dfs:
if len[df] == 20:
the_one = df
break
0 trả về danh sách tất cả các phần tử thỏa mãn các yêu cầu mà chúng tôi chuyển cho nó. Sau đó, chúng tôi phải chọn bảng chúng tôi cần trong danh sách đófrom O365 import Account
# Never hard code credentials or store them in a repo
# Use environmental variables instead
credentials = [o365credid, o365credpwd]
account = Account[credentials]
def send_email[account, to, subject, start, body, end]:
m = account.new_message[]
m.to.add[to]
m.subject = subject
m.body = start + body + end
m.send[]
3Ví dụ, tùy thuộc vào trang web, sẽ cần chỉ định lớp bảng hoặc id
Phần còn lại của quá trình bây giờ gần như trực quan, phải không? . Chúng tôi chỉ có thể sử dụng lại
for df in dfs:
if len[df] == 20:
the_one = df
break
0 để tìm tất cả các thẻ df = dfs[4]
7, vâng, nhưng chúng tôi cũng có thể lặp lại các thẻ này theo cách đơn giản hơnThuộc tính ____86 trả về một đối tượng có thể lặp lại với tất cả các thẻ ngay bên dưới thẻ cha, là
for df in dfs:
if len[df] == 20:
the_one = df
break
7, do đó, nó trả về tất cả các thẻ df = dfs[4]
7. Vì nó là một đối tượng có thể lặp lại, chúng ta cần sử dụng nó như vậySau đó, mỗi
for df in dfs:
if len[df] == 20:
the_one = df
break
9 là thẻ df = dfs[4]
7. Chúng tôi chỉ cần trích xuất văn bản của từng thẻ df = dfs[4]
9 bên trong nó. Đây là mã cho tất cả điều nàystart = """
Data table here:
"""
end = """
"""
5Và quá trình được thực hiện. Sau đó, bạn có dữ liệu mà bạn đang tìm kiếm và bạn có thể thao tác với nó theo cách phù hợp nhất với mình
Khả năng khác
Ví dụ, giả sử bạn không quan tâm đến tiêu đề của bảng. Thay vì sử dụng
for df in dfs:
if len[df] == 20:
the_one = df
break
6, bạn có thể chọn thẻ df = dfs[4]
7 đầu tiên chứa dữ liệu tiêu đề và sử dụng thuộc tính for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
4. Điều này, giống như thuộc tính thefor df in dfs:
if len[df] == 20:
the_one = df
break
6, sẽ trả về một lần lặp, nhưng với tất cả các thẻ df = dfs[4]
7 khác, là các thẻ anh em của thẻ đầu tiên mà chúng tôi đã chọn. Sau đó, bạn sẽ bỏ qua tiêu đề của bảngdf = dfs[4]
0Giống như con cái và anh chị em tiếp theo, bạn cũng có thể tìm kiếm anh chị em trước đó, cha mẹ, con cháu, v.v. Khả năng là vô tận, vì vậy hãy đảm bảo kiểm tra tài liệu của BeautifulSoup để tìm ra lựa chọn tốt nhất cho máy cạp của bạn
Cho đến nay, chúng tôi đã viết một số mã rất đơn giản để trích xuất các bảng HTML bằng Python. Tuy nhiên, khi làm điều này thực sự, tất nhiên, bạn sẽ có một số vấn đề khác cần xem xét
Chẳng hạn, bạn cần biết bạn sẽ lưu trữ dữ liệu của mình như thế nào. Bạn sẽ trực tiếp viết nó trong một tập tin văn bản? . tập tin csv? . Lựa chọn của tôi là lưu trữ mọi thứ trong một danh sách lớn các danh sách mà sau này sẽ được chuyển thành DataFrame và xuất dưới dạng. tệp csv
Trong một chủ đề khác, bạn có thể muốn sử dụng một số mệnh đề
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
7 và for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
8 trong mã của mình để sẵn sàng xử lý một số ngoại lệ mà nó có thể tìm thấy trong quá trình thực hiện. Tất nhiên, bạn cũng sẽ muốn chèn một số khoảng dừng ngẫu nhiên để không làm quá tải máy chủ, đồng thời tận dụng lợi thế của nhà cung cấp proxy, chẳng hạn như Infatica, để đảm bảo mã của bạn sẽ tiếp tục chạy miễn là còn bảng để Trong ví dụ này, tôi đã xem xét bảng xếp hạng Premier League sau mỗi vòng trong toàn bộ mùa giải 2019/20 bằng cách sử dụng hầu hết những gì tôi đã trình bày trong bài viết này. Đây là toàn bộ mã cho nó
Mọi thứ đều ở đó. thu thập tất cả các phần tử trong bảng bằng cách sử dụng thuộc tính
for df in dfs:
if len[df] == 20:
the_one = df
break
6, xử lý các ngoại lệ, chuyển đổi dữ liệu thành DataFrame, xuất một. csv và tạm dừng mã trong một số giây ngẫu nhiên. Sau tất cả những điều này, tất cả dữ liệu được thu thập bởi mã này đã tạo ra biểu đồ thú vị nàyHình ảnh của tác giả
Bạn sẽ không tìm thấy dữ liệu cần thiết để vẽ một biểu đồ như vậy đang chờ bạn trên internet. Nhưng đó là vẻ đẹp của cạo. bạn có thể tự đi lấy dữ liệu
Cuối cùng, tôi hy vọng nó hữu ích bằng cách nào đó và bạn sẽ không bao giờ gặp sự cố khi cạo lại bảng HTML. Nếu bạn có câu hỏi, đề xuất hoặc chỉ muốn liên hệ, vui lòng liên hệ qua Twitter, GitHub hoặc Linkedin