Python BeautifulSoup lấy tất cả các trang

Quét web là quá trình trích xuất dữ liệu từ các trang web khác nhau và phân tích cú pháp nó. Nói cách khác, đó là một kỹ thuật trích xuất dữ liệu phi cấu trúc và lưu trữ dữ liệu đó trong tệp cục bộ hoặc trong cơ sở dữ liệu. Có nhiều cách để thu thập dữ liệu đòi hỏi một lượng lớn công việc khó khăn và tiêu tốn nhiều thời gian. Quét web có thể tiết kiệm cho lập trình viên nhiều giờ

Các bước cơ bản liên quan đến quét web là

  • Đang tải tài liệu [nội dung HTML]

  • Phân tích tài liệu

  • Khai thác

  • chuyển đổi

súp đẹp

Beautiful Soup là một thư viện quét web Python cho phép chúng tôi phân tích cú pháp và cạo các trang HTML và XML. Bạn có thể tìm kiếm, điều hướng và sửa đổi dữ liệu bằng trình phân tích cú pháp. Nó linh hoạt và tiết kiệm rất nhiều thời gian. Trong bài viết này chúng ta sẽ tìm hiểu cách cạo dữ liệu bằng Beautiful Soup

Bước 1. Cài đặt

Beautiful Soup có thể được cài đặt bằng lệnh pip. Bạn cũng có thể thử pip3 nếu pip không hoạt động

1
2
res = doc.find[id = "content"]
print[res]
3

1
2
res = doc.find[id = "content"]
print[res]
4

Mô-đun yêu cầu được sử dụng để nhận nội dung HTML

Bước 2. Kiểm tra nguồn

Bước tiếp theo là kiểm tra trang web mà bạn muốn cạo. Bắt đầu bằng cách mở trang web của bạn trong trình duyệt. Đi qua cấu trúc của trang web và tìm phần của trang web bạn muốn cạo. Tiếp theo, hãy kiểm tra trang web bằng các công cụ dành cho nhà phát triển bằng cách đi tới Công cụ khác>Công cụ dành cho nhà phát triển. Cuối cùng, mở tab Thành phần trong công cụ dành cho nhà phát triển của bạn

Bước 3. Lấy nội dung HTML

Tiếp theo, lấy nội dung HTML từ một trang web. Chúng tôi sử dụng mô-đun yêu cầu để thực hiện tác vụ này. Chúng ta gọi hàm “get” bằng cách chuyển URL của trang web làm đối số cho hàm này như hình bên dưới

1
2
3
4
5
6
7
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
print[result]

Trong đoạn mã trên, chúng tôi đang đưa ra một yêu cầu HTTP GET tới URL được chỉ định. Sau đó, chúng tôi đang lưu trữ dữ liệu HTML mà máy chủ nhận được trong một đối tượng Python. Các. thuộc tính văn bản sẽ in dữ liệu HTML.
Bước 4. Phân tích cú pháp trang HTML bằng Beautiful Soup
Bây giờ chúng ta đã có nội dung HTML trong tài liệu, bước tiếp theo là phân tích cú pháp và xử lý dữ liệu. Để làm như vậy, chúng tôi nhập thư viện này, tạo một thể hiện của lớp BeautifulSoup và xử lý dữ liệu.

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]

Hàm prettify[] sẽ cho phép chúng tôi in nội dung HTML ở dạng lồng nhau dễ đọc và sẽ giúp trích xuất các thẻ có sẵn cần thiết.
Có hai phương pháp để tìm thẻ. tìm và find_all[].
Tìm[]. Phương thức này tìm phần tử khớp đầu tiên.
Find_all[]. Phương pháp này tìm thấy tất cả các yếu tố phù hợp.

Tìm phần tử theo ID

Chúng ta đều biết rằng mọi thành phần của trang HTML đều được gán một thuộc tính ID duy nhất. Bây giờ chúng ta thử tìm một phần tử bằng cách sử dụng giá trị của thuộc tính ID. Ví dụ mình đang muốn tìm một thuộc tính ID có giá trị là “nội dung” như hình bên dưới

1
2
res = doc.find[id = "content"]
print[res]

Tìm phần tử theo tên lớp

Ví dụ, nếu chúng ta muốn tìm một phần tử theo tên lớp trong res ở trên, chúng ta sẽ trích xuất phần tử h1 có tên lớp là “firstHeading”,

Danh sách các tiểu bang và vùng lãnh thổ của Hoa Kỳ
1
2
heading = res.find[class_ = "firstHeading"]
print[heading]

[

Danh sách các tiểu bang và vùng lãnh thổ của Hoa Kỳ]

Trích xuất văn bản từ các phần tử HTML

Nếu chúng tôi chỉ muốn tìm văn bản từ thẻ tiêu đề ở trên, chúng tôi có thể làm như vậy bằng cách sau

1
2
res = doc.find[id = "content"]
print[res]
5

“Danh sách các tiểu bang và vùng lãnh thổ của Hoa Kỳ”

Truy cập các thẻ lồng nhau

Ví dụ: chúng tôi sẽ cố gắng tìm tất cả các thẻ h2 trong

phần tử có id=”nội dung”.
1
2
3
res = doc.find[id = "content"]
for ele in res:
  print[res.find["h2"]]
1
2
3
4
5
6
7
8
9
10
11

Contents

< h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2> < h2 id = "mw-toc-heading" > Contents < /h2>

Tìm kiếm bằng Chuỗi [văn bản]

Ví dụ: nếu bạn muốn tìm kiếm văn bản “Đặt tôi tự do”, bạn có thể thực hiện bằng cách sử dụng mã bên dưới

1
2
res = doc.find_all[text = "California"]
print[res]

1
2
res = doc.find[id = "content"]
print[res]
6

Tìm kiếm bằng cách chuyển một danh sách

Bạn cũng có thể chuyển một danh sách tới hàm find_all[] và Beautiful Soup sẽ tìm tất cả các phần tử khớp với bất kỳ mục nào trong danh sách đó.
Ví dụ, đoạn mã dưới đây sẽ tìm tất cả các ,

thẻ trong tài liệu

1
2
res = doc.find[id = "content"]
print[res]
7

Tìm kiếm bằng biểu thức chính quy

Nếu bạn chuyển vào biểu thức chính quy, Beautiful Soup sẽ lọc bằng biểu thức chính quy. Ta sẽ phải import lại như hình bên dưới

1
2
res = doc.find[id = "content"]
print[res]
2____13

Hơn nữa, nếu bạn chỉ muốn nhận được một số kết quả giới hạn, bạn có thể làm như vậy bằng cách sử dụng giới hạn

1
2
res = doc.find[id = "content"]
print[res]
4
1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
0

Tìm kiếm bằng Bộ chọn CSS

Beautiful Soup có một. phương thức chọn cho phép chúng tôi lọc bằng bộ chọn CSS

1
2
res = doc.find[id = "content"]
print[res]
8

1
2
res = doc.find[id = "content"]
print[res]
9

Bạn cũng có thể chọn các thẻ bên dưới các thẻ khác như

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
0

Tìm thẻ theo lớp CSS

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
1

Tìm thẻ theo ID

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
1

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
2

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
2

Kiểm tra xem Thuộc tính có tồn tại trong Thẻ không

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
3

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
4

Một bài tập thực hành đơn giản

Trong bài tập này, chúng ta sẽ lấy một trang web từ Wikipedia với URL [https. // vi. wikipedia. org/wiki/List_of_states_and_territories_of_the_United_States] làm ví dụ. Trang này chứa danh sách các tiểu bang trong U. S, dân số và các chi tiết khác. Chúng tôi sẽ cố gắng lấy tên của các tiểu bang và các cột dân số của bảng

Bước đầu tiên là xác định văn bản hoặc khu vực của trang web sẽ được cạo. Để tìm thấy điều đó, chỉ cần chọn khu vực của trang, nhấp chuột phải rồi nhấp vào kiểm tra.
Bạn có thể thấy phần tử mà tôi đang tìm nằm trong bảng có tên lớp “wikitable sortable plainrowheaders” và nó là một chuỗi thẻ được lồng bên trong thẻ.

Bây giờ chúng ta hãy viết mã để lấy dữ liệu.
Cài đặt các thư viện cần thiết.

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
3

Trong bước tiếp theo, chúng tôi sẽ sử dụng yêu cầu nhận bằng cách chuyển URL của trang web sẽ được phân tích cú pháp. Hơn nữa, chúng ta tạo một đối tượng Beautiful Soup với “html. trình phân tích cú pháp”

Sau đó, chúng tôi sử dụng đối tượng BeautifulSoup được tạo ở trên và thu thập dữ liệu bảng cần thiết bằng cách sử dụng tên lớp

  1. my_table=doc. find[“bảng”, class_=“tiêu đề phẳng có thể sắp xếp theo wiki”]

Sau đó, chúng tôi trích xuất tất cả các thẻ trong bảng của mình và cuối cùng nhận được văn bản bên trong các thẻ

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
4
1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
5

Trong kết quả trên, bạn có thể quan sát thấy rằng danh sách của chúng tôi bắt đầu từ chỉ số 9 và chúng tôi cũng có một vài [D] ở giữa. Chúng tôi sẽ chuẩn bị danh sách cuối cùng bằng cách loại bỏ các chuỗi không mong muốn

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
6

Và cuối cùng, kết quả là đây

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
7

Theo cách tương tự, bây giờ chúng ta sẽ cố gắng lấy các cột dân số từ cùng một bảng. Khi tôi kiểm tra phần tử cột, tôi có thể thấy rằng nó được chứa bên trong

các thẻ như hình bên dưới

Mã đi như sau

1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
8
1
2
3
4
5
6
7
8
9
10
11
from bs4
import BeautifulSoup
#import requests library
import requests
#the website URL
url_link = "//en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"
result = requests.get[url_link]
  .text
doc = BeautifulSoup[result, "html.parser"]

print[doc.prettify[]]
9

Bây giờ chúng tôi sẽ loại bỏ các chuỗi không mong muốn ở giữa

1
2
res = doc.find[id = "content"]
print[res]
0

Và kết quả cuối cùng là đây

1
2
res = doc.find[id = "content"]
print[res]
1

Ghi dữ liệu vào CSV

1
2
res = doc.find[id = "content"]
print[res]
2

dân số bang lập chỉ mục
0 Alabama 5.024.279
1 Alaska 733.391
2 Arizona 7.151.502
3 Arkansas 3,011,524
4 California 39,538,223
5 Colorado 5,773,714
6 Connecticut 3,605,944
7 Delaware 989,948
8 Florida 21,538,187
9 Georgia 10,711,908
10 Hawaii 1,455,271
11 Idaho 1,839,106
12 Illinois 12,812,508
13 Indiana 6,785,528
14 Iowa 3,190,369
15 Kansas 2,937,880
16 Kentucky 4,505,836
17 Louisiana 4,657,757
18 Maine 1,362,359
19 Maryland 6,177,224
20 Massachusetts 7,029,917
21 Michigan 10,077,331
22 Minnesota 5,706,494
23 Mississippi 2,961,279
24 Missouri 6,154,913
25 Montana 1,084,225
26 Nebraska 1,961,504
27 Nevada 3,104,614
28 New Hampshire 1,377,529
29 New Jersey 9,288,994
30 New Mexico 2,117,522
31 New York 20,201,249
32 North Carolina 10,439,388
33 North Dakota 779,094
34 Ohio 11,799,448
35 Oklahoma 3,959,353
36 Oregon 4,237,256
37 Pennsylvania 13,002,700
38 Rhode Island 1,097,379
39 South Carolina 5,118,425
40 South Dakota 886,667
41 Tennessee 6,910,840
42 Texas 29,145,505
43 Utah 3,271,616
44 Vermont 643,077
45 Virginia 8,631,393
46 Washington 7,705,281
47 West Virginia 1,793,716
48 Wisconsin 5,893,718
49 Wyoming 576,851

Sau đó, chúng tôi ghi khung dữ liệu vào tệp CSV bằng dòng mã bên dưới

1
2
heading = res.find[class_ = "firstHeading"]
print[heading]
5

Phần kết luận

Beautiful Soup rất dễ học và thân thiện với người mới bắt đầu. Trong bài viết này, chúng tôi đã hoàn thành kiến ​​thức cơ bản về quét web bằng Beautiful Soup và cũng đã thực hiện một dự án mẫu để hiểu rõ hơn về các khái niệm. Tóm lại, thư viện yêu cầu cho phép bạn tìm nạp nội dung HTML tĩnh từ Internet và gói Beautiful Soup cho phép bạn phân tích cú pháp HTML bằng trình phân tích cú pháp. Tuy nhiên, có nhiều khái niệm nâng cao, thú vị hơn để tìm hiểu về chủ đề này. Bạn có thể tìm tài liệu ở đây

Chủ Đề