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ắ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 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 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
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ì URLpage = 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ốngdfs = pd.read_html[url]
2Việ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 BeautifulSoupMặ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]
3Trong đó
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 đódfs = pd.read_html[url]
8Ví 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ơnThuộ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ậySau đó, 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àyfor df in dfs:
if len[df] == 20:
the_one = df
break
0Và 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 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à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