Hướng dẫn how do you scrape a table in html? - làm thế nào để bạn quét một bảng trong html?

Và cũng là một ví dụ thực tế

Ảnh của Markus Spiske trên unplash

Nó rất phổ biến để chạy vào các bảng HTML trong khi cạo một trang web và không có cách tiếp cận đúng, 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 cạo nhanh, hiệu quả các yếu tố này với 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 đẹp.

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. Mặc dù thật hợp lý khi thông báo cho bạn điều này, nhưng bảng được cào won tạo ra nhiều sự khác biệt trong khi bạn đọc khi tôi cố gắng làm cho bài viết này trở nên tổng quát nhất có thể.

pandas.read_html (): phím 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, bạn thậm chí không cần phải thiết lập toàn bộ cào để làm điều đó vì gấu trúc có thể tự hoàn thành công việc này.

df = dfs[4]
1Function 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 các khung dữ liệu để tìm mã bạn đang tìm kiếm theo chiều dài của nó…

for df in dfs:
if len(df) == 20:
the_one = df
break

Ví dụ, tên của các cột của nó.

for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break

Nhưng Pandas không được thực hiện 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 sẽ khớp;
df = dfs[4]
3 để lấy bảng với các tiêu đề cụ thể bạn vượt qua; Ví dụ,
df = dfs[4]
4Parameter cho phép bạn xác định bảng theo lớp hoặc ID của nó chẳng hạn.

Tuy nhiên, nếu bạn không chỉ cạo các bảng và đang sử dụng, hãy nói, các yêu cầu để có được trang, bạn đã khuyến khích chuyển

df = dfs[4]
5 cho chức năng 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 sử dụng trình điều khiển web Selenium để lấy trang:

dfs = pd.read_html(driver.page_source)

Điều đó bởi vì bằng cách thực hiện điều này, bạn sẽ giảm đáng kể thời gian mã của bạn để chạy vì

df = dfs[4]
6Function không cần phải có được 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 kịch bản:

Using the URL:
Average time elapsed: 0.2345 seconds
Using page.text:
Average time elapsed: 0.0774 seconds

Sử dụng URL làm cho mã chậm hơn khoảng ba lần. Vì vậy, nó chỉ có ý nghĩa khi sử dụng nó nếu bạn không nhận được trang trước bằng các thư viện khác.

Nhận bảng các yếu tố trên bàn với người đẹp

Mặc dù gấu trúc thực sự là 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 phải cạo một phần tử bảng khôn ngoan, có thể vì bạn không muốn toàn bộ bảng hoặc vì cấu trúc bảng không nhất quán hoặc vì bất kỳ lý do nào khác.

Để bao quát điều đó, trước tiên chúng ta cần hiểu cấu trúc tiêu chuẩn của bảng HTML:

<table>
<tr>
<th>
<th>
<th>
<th>
<th>
<th>
<th>
</tr>
<tr>
<td>
<td>
<td>
<td>
<td>
<td>
<td>
</tr>
<tr>
<td>
<td>
<td>
<td>
<td>
<td>
<td>
</tr>
.
.
.
</table>

Trong đó

df = dfs[4]
7Stands cho các hàng bảng,
df = dfs[4]
8Stands cho tiêu đề bảng bảng và
df = dfs[4]
9stands cho dữ liệu bảng bảng, đó là nơi lưu trữ dữ liệu dưới dạng văn bản.

Mẫu thường hữu ích, vì vậy tất cả những gì chúng tôi còn lại là chọn các yếu tố chính xác bằng cách sử dụng đẹp.

Điều đầu tiên cần làm là tìm bảng.

for df in dfs:
if len(df) == 20:
the_one = df
break
0Method trả về một danh sách tất cả các yếu tố đáp ứng các yêu cầu 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 đó:

table = soup.find_all('table')[4]

Tùy thuộc vào trang web, ví dụ như 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 ta chỉ cần chọn tất cả các

df = dfs[4]
7Tags và văn bản trong
df = dfs[4]
8and
df = dfs[4]
9Tags bên trong chú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
df = dfs[4]
7Tags, vâng, nhưng chúng tôi cũng có thể lặp lại các thẻ này một cách thẳng thắn hơn.

Thuộc tính ____26 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
df = dfs[4]
7Tags. 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ẻ
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
0. Chúng ta chỉ cần trích xuất văn bản của mỗi thẻ
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
1 bên trong nó. Đây là mã cho tất cả điều này:

for child in soup.find_all('table')[4].children:
for td in child:
print(td.text)

Và quá trình được thực hiện! Sau đó, bạn có dữ liệu bạn đang tìm kiếm và bạn có thể điều khiển nó theo cách nó phù hợp nhất với bạn.

Các khả năng khác

Ví dụ, hãy nói rằng bạn không quan tâm đến tiêu đề 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
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
0TAG đầu tiên, chứa dữ liệu tiêu đề và sử dụng
for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
4Attribution. Điều này, giống như thuộc tính ____26, sẽ trả về một thứ khác, nhưng với tất cả các thẻ ____30 khác, là anh chị em của cái đầu tiên chúng tôi đã chọn. Sau đó, bạn đã bỏ qua tiêu đề của bàn.siblings of the first one we selected. You’d be then skipping the header of the table.

df = dfs[4]
0

Cũng giống như trẻ em và anh chị em tiếp theo, bạn cũng có thể tìm kiếm anh chị em, cha mẹ, con cháu trước đây và nhiều hơn nữa. Các khả năng là vô tận, vì vậy hãy đảm bảo kiểm tra tài liệu BeautifulSoup để tìm tùy chọn tốt nhất cho 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 thẳng về phía trước để trích xuất các bảng HTML bằng Python. Tuy nhiên, khi làm điều này cho thực tế, bạn, tất nhiên, có một số vấn đề khác để 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? Hoặc bạn sẽ lưu trữ nó trong một danh sách hoặc trong một từ điển và sau đó tạo tệp .csv? Hoặc bạn sẽ tạo một khung dữ liệu trống và điền vào nó với dữ liệu? Chắc chắn có rất nhiều khả năng. 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 đó sẽ được chuyển thành một khung dữ liệu và được 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ố điều khoản

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 bạn để làm cho nó chuẩn bị để xử lý một số ngoại lệ mà nó có thể tìm thấy trên đường đi. Tất nhiên, bạn cũng sẽ muốn chèn một số tạm dừng ngẫu nhiên để không quá tải máy chủ và cũng tận dụng 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 lại các bảng để còn lại Scrape và rằng bạn và kết nối của bạn được bảo vệ.

Trong ví dụ này, tôi đã cạo bả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 đã đề cập 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 yếu tố trong bảng bằng cách sử dụng

for df in dfs:
if df.columns == ['#', 'Team', 'MP', 'W', 'D', 'L', 'Points']:
the_one = df
break
9Attribution, xử lý các ngoại lệ, biến dữ liệu thành một khung dữ liệu, xuất tệp .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ả cá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ẽ biểu đồ như thế đang chờ bạn trên internet. Nhưng đó là vẻ đẹp của việc cạo: Bạn có thể tự mình lấy dữ liệu!

Như một sự kết thúc, tôi hy vọng bằng cách nào đó hữu ích và bạn không bao giờ gặp vấn đề gì khi cạo một bảng HTML nữa. Nếu bạn có một câu hỏi, một gợi ý hoặc chỉ muốn liên lạc, hãy liên hệ thông qua Twitter, GitHub hoặc LinkedIn.

Cảm ơn vì đã đọc!

Làm thế nào để bạn cạo một cái bàn?

Cách cạo bảng từ trang web bằng Python..
Cài đặt thư viện. Trước hết, chúng tôi cần các thư viện cần thiết này được cài đặt trong môi trường của chúng tôi: ....
Nhập thư viện bắt buộc. ....
Chọn trang. ....
XIN PHEP. ....
Kiểm tra yếu tố bảng. ....
Tạo một danh sách cột. ....
Tạo một khung dữ liệu. ....
Tạo một vòng lặp để điền vào DataFrame ..

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

Để trích xuất một bảng từ HTML, trước tiên bạn cần mở các công cụ nhà phát triển của mình để xem HTML trông như thế nào và xác minh xem nó có thực sự là một bảng chứ không phải một số yếu tố khác.Bạn mở các công cụ của nhà phát triển bằng khóa F12, xem tab Phần tử trực tuyến và làm nổi bật phần tử mà bạn quan tâm.open developer tools with the F12 key, see the “Elements” tab, and highlight the element you're interested in.

Làm thế nào để bạn thực hiện cào trong html?

Làm thế nào để bạn cạo dữ liệu từ một trang web ?..
Tìm URL mà bạn muốn cạo ..
Kiểm tra trang ..
Tìm dữ liệu bạn muốn trích xuất ..
Viết mã ..
Chạy mã và trích xuất dữ liệu ..
Lưu trữ dữ liệu theo định dạng cần thiết ..

Làm thế nào để bạn cạo các bảng HTML bằng cách sử dụng đẹp?

Cách cạo bàn từ trang web bằng súp đẹp..
Nhập các mô -đun cần thiết (BS4, Pandas, yêu cầu) ..
Tải tài liệu HTML ..
Chuyển tài liệu HTML vào hàm đẹp () ..
Nhận các thuộc tính của bảng từ trang web bằng phương thức ".select ()" ..