Chuỗi gấu trúc vào bảng html

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ơn

12 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ói

pip 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 html

Tạ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ắng

Ví 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ắt

Nế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 trang

dfs = 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ì URL

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[]]
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ống

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[]]
7

Việ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

Lấy các phần tử của bảng với BeautifulSoup

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[]]
8

Trong đó

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ản

Mẫ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[]
3

Ví 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ơn

Thuộ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ậy

Sau đó, 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ày

start = """
                
                    Data table here:
""" end = """ """
5

Và 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 the
for 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ảng

df = dfs[4]
0

Giố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

Một ví dụ thực tế

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ày

Hì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

Chủ Đề