Bảng HTML để nhắn tin Python

Tệp CSV là tệp Giá trị được phân tách bằng dấu phẩy sử dụng dấu phẩy để phân tách các giá trị. Tệp CSV là một thứ hữu ích trong thế giới ngày nay khi chúng ta nói về máy học, xử lý dữ liệu và trực quan hóa dữ liệu. Trong bài viết này, chúng tôi sẽ thảo luận về cách chuyển đổi bảng HTML thành tệp CSV

Chuyển đổi Bảng HTML thành tệp CSV trong Python

Ví dụ. Giả sử tệp HTML trông giống như bảng HTML có thể được chuyển đổi thành tệp CSV bằng cách sử dụng mô-đun BeautifulSoup và Pandas của Python. Các mô-đun này không được tích hợp sẵn với Python. Để cài đặt chúng, gõ lệnh dưới đây trong thiết bị đầu cuối

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 cạo 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

for df in dfs:
if len[df] == 20:
the_one = df
break

… 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

page = requests.get[url]
soup = BeautifulSoup[page.text, 'html.parser']

dfs = pd.read_html[page.text]

Điều tương tự cũng xảy ra nếu bạn đang sử dụng Selenium webdriver để truy cập trang

dfs = pd.read_html[url]
0

Đó 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

dfs = pd.read_html[url]
2

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

dfs = pd.read_html[url]
3

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 đó

dfs = pd.read_html[url]
8

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

for df in dfs:
if len[df] == 20:
the_one = df
break
0again để 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 ____36 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 thẻ

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

for df in dfs:
if len[df] == 20:
the_one = df
break
0

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 văn bản chứ? . 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

Làm cách nào để trích xuất văn bản từ bảng HTML trong Python?

Đối với điều này, bạn có thể sử dụng các thư viện python khác nhau giúp bạn trích xuất nội dung từ bảng HTML. Một phương thức như vậy có sẵn trong thư viện Python Pandas phổ biến, nó được gọi là read_html[] . Phương thức này chấp nhận nhiều đối số cho phép bạn tùy chỉnh cách bảng sẽ được phân tích cú pháp.

Làm cách nào để đọc các bảng từ HTML bằng Python?

Đọc HTML . Hàm này đọc các bảng tệp HTML dưới dạng Pandas DataFrames. Nó có thể đọc từ một tệp hoặc một URL. using the read_html[] function. This function read tables of HTML files as Pandas DataFrames. It can read from a file or a URL.

Làm cách nào để chuyển đổi HTML sang bảng Python?

csv' bằng Python, hãy làm theo ba bước sau. .
Nhập thư viện gấu trúc
Đọc bảng HTML dưới dạng DataFrame df bằng cách gọi pd. read_html['my_file. html']
Ghi DataFrame vào CSV bằng cách gọi df. to_csv['my_file. csv', index=False] nếu bạn không cần chỉ mục số hàng

Làm cách nào để phân tích cú pháp dữ liệu HTML bằng Python?

Ví dụ .
từ html. trình phân tích cú pháp nhập HTMLParser
Trình phân tích cú pháp lớp [HTMLParser]
# phương pháp nối thêm thẻ bắt đầu vào danh sách start_tags
def handle_starttag[bản thân, thẻ, attrs]
start_tags toàn cầu
start_tags. nối thêm [thẻ]
# phương pháp nối thêm thẻ kết thúc vào danh sách end_tags
def handle_endtag[bản thân, thẻ]

Chủ Đề