Làm cách nào để lấy giá trị từ HTML Python?

Quét web là quá trình thu thập và phân tích dữ liệu thô từ Web và cộng đồng Python đã đưa ra một số công cụ quét web khá mạnh mẽ

Internet có lẽ là nguồn thông tin lớn nhất trên hành tinh. Nhiều ngành, chẳng hạn như khoa học dữ liệu, kinh doanh thông minh và báo cáo điều tra, có thể hưởng lợi rất nhiều từ việc thu thập và phân tích dữ liệu từ các trang web

Trong hướng dẫn này, bạn sẽ học cách

  • Phân tích dữ liệu trang web bằng các phương thức chuỗi và biểu thức chính quy
  • Phân tích dữ liệu trang web bằng trình phân tích cú pháp HTML
  • Tương tác với các biểu mẫu và các thành phần trang web khác

Ghi chú. Hướng dẫn này được chuyển thể từ chương “Tương tác với Web” trong Python Basics. Giới thiệu thực tế về Python 3

Cuốn sách sử dụng trình soạn thảo IDLE tích hợp sẵn của Python để tạo và chỉnh sửa các tệp Python cũng như tương tác với trình bao Python, vì vậy, thỉnh thoảng bạn sẽ thấy các tham chiếu đến IDLE trong suốt hướng dẫn này. Tuy nhiên, bạn sẽ không gặp vấn đề gì khi chạy mã ví dụ từ trình chỉnh sửa và môi trường bạn chọn

Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để thu thập và phân tích dữ liệu từ Web

Cạo và phân tích văn bản từ các trang web

Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là quét web. Một số trang web nghiêm cấm người dùng lấy dữ liệu của họ bằng các công cụ tự động như những công cụ mà bạn sẽ tạo trong hướng dẫn này. Trang web làm điều này vì hai lý do có thể

  1. Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Chẳng hạn, Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh
  2. Thực hiện nhiều yêu cầu lặp lại đối với máy chủ của trang web có thể sử dụng hết băng thông, làm chậm trang web đối với những người dùng khác và có khả năng làm quá tải máy chủ khiến trang web ngừng phản hồi hoàn toàn

Trước khi sử dụng các kỹ năng Python của bạn để quét web, bạn phải luôn kiểm tra chính sách sử dụng được chấp nhận của trang web mục tiêu của mình để xem việc truy cập trang web bằng các công cụ tự động có vi phạm điều khoản sử dụng của trang web hay không. Về mặt pháp lý, việc tìm kiếm trang web trái với mong muốn của một trang web là một khu vực màu xám

Quan trọng. Xin lưu ý rằng các kỹ thuật sau đây khi được sử dụng trên các trang web cấm quét web

Đối với hướng dẫn này, bạn sẽ sử dụng một trang được lưu trữ trên máy chủ của Real Python. Trang mà bạn sẽ truy cập đã được thiết lập để sử dụng với hướng dẫn này

Bây giờ bạn đã đọc tuyên bố từ chối trách nhiệm, bạn có thể xem nội dung thú vị. Trong phần tiếp theo, bạn sẽ bắt đầu lấy tất cả mã HTML từ một trang web

Loại bỏ các quảng cáo

Xây dựng công cụ quét web đầu tiên của bạn

Một gói hữu ích để quét web mà bạn có thể tìm thấy trong thư viện chuẩn của Python là

>>> title_index = html.find[""]
>>> title_index
14
6, chứa các công cụ để làm việc với URL. Đặc biệt, mô-đun
>>> title_index = html.find[""]
>>> title_index
14
7 chứa một chức năng có tên là
>>> title_index = html.find[""]
>>> title_index
14
8 mà bạn có thể sử dụng để mở một URL trong chương trình

Trong cửa sổ tương tác của IDLE, hãy nhập nội dung sau để nhập

>>> title_index = html.find[""]
>>> title_index
14
8

>>>

>>> from urllib.request import urlopen

Trang web mà bạn sẽ mở nằm ở URL sau

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"

Để mở trang web, hãy chuyển

>>> start_index = title_index + len[""]
>>> start_index
21
0 đến
>>> title_index = html.find[""]
>>> title_index
14
8

>>>

>>> page = urlopen[url]

>>> title_index = html.find[""]
>>> title_index
14
8 trả về một đối tượng
>>> start_index = title_index + len[""]
>>> start_index
21
3

>>>

>>> page

Để trích xuất HTML từ trang, trước tiên hãy sử dụng phương thức

>>> start_index = title_index + len[""]
>>> start_index
21
5 của đối tượng
>>> start_index = title_index + len[""]
>>> start_index
21
3, phương thức này trả về một chuỗi byte. Sau đó, sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
6 để giải mã các byte thành một chuỗi bằng cách sử dụng

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]

Bây giờ bạn có thể in HTML để xem nội dung của trang web

>>>

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus

Đầu ra mà bạn đang thấy là mã HTML của trang web mà trình duyệt của bạn hiển thị khi bạn truy cập

>>> start_index = title_index + len[""]
>>> start_index
21
7

Với

>>> title_index = html.find[""]
>>> title_index
14
6, bạn đã truy cập trang web tương tự như cách bạn làm trong trình duyệt của mình. Tuy nhiên, thay vì hiển thị nội dung một cách trực quan, bạn đã lấy mã nguồn dưới dạng văn bản. Bây giờ bạn đã có HTML dưới dạng văn bản, bạn có thể trích xuất thông tin từ nó theo một số cách khác nhau

Trích xuất văn bản từ HTML bằng các phương thức chuỗi

Một cách để trích xuất thông tin từ HTML của trang web là sử dụng. Chẳng hạn, bạn có thể sử dụng

>>> start_index = title_index + len[""]
>>> start_index
21
9 để tìm kiếm trong văn bản HTML cho các thẻ
>>> end_index = html.find[""]
>>> end_index
39
0 và trích xuất tiêu đề của trang web

Để bắt đầu, bạn sẽ trích xuất tiêu đề của trang web mà bạn đã yêu cầu trong ví dụ trước. Nếu bạn biết chỉ mục của ký tự đầu tiên của tiêu đề và chỉ mục của ký tự đầu tiên của thẻ đóng

>>> end_index = html.find[""]
>>> end_index
39
1, thì bạn có thể sử dụng a để trích xuất tiêu đề

Bởi vì

>>> start_index = title_index + len[""]
>>> start_index
21
9 trả về chỉ số của lần xuất hiện đầu tiên của một chuỗi con, nên bạn có thể lấy chỉ mục của thẻ mở đầu
>>> end_index = html.find[""]
>>> end_index
39
0 bằng cách chuyển chuỗi
>>> end_index = html.find[""]
>>> end_index
39
4 đến
>>> start_index = title_index + len[""]
>>> start_index
21
9

>>>

>>> title_index = html.find[""]
>>> title_index
14

Tuy nhiên, bạn không muốn chỉ mục của thẻ

>>> end_index = html.find[""]
>>> end_index
39
0. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi
>>> end_index = html.find[""]
>>> end_index
39
4 vào
>>> end_index = html.find[""]
>>> end_index
39
8

>>>

>>> start_index = title_index + len[""]
>>> start_index
21

Bây giờ hãy lấy chỉ mục của thẻ đóng

>>> end_index = html.find[""]
>>> end_index
39
1 bằng cách chuyển chuỗi
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
0 đến
>>> start_index = title_index + len[""]
>>> start_index
21
9

>>>

>>> end_index = html.find[""]
>>> end_index
39

Cuối cùng, bạn có thể trích xuất tiêu đề bằng cách cắt chuỗi

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2

>>>

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'

HTML trong thế giới thực có thể phức tạp hơn nhiều và khó dự đoán hơn nhiều so với HTML trên trang hồ sơ Aphrodite. Đây là một trang hồ sơ khác với một số HTML lộn xộn hơn mà bạn có thể cạo

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
0

Hãy thử trích xuất tiêu đề từ URL mới này bằng phương pháp tương tự như trong ví dụ trước

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
1

Rất tiếc. Có một chút HTML trộn lẫn với tiêu đề. Tại sao vậy?

HTML cho trang

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
3 trông tương tự như trang
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
4, nhưng có một sự khác biệt nhỏ. Thẻ mở
>>> end_index = html.find[""]
>>> end_index
39
0 có thêm một khoảng trắng trước dấu ngoặc nhọn đóng [
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6], hiển thị nó thành
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
7

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
8 trả về
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9 vì chuỗi con chính xác
>>> end_index = html.find[""]
>>> end_index
39
4 không tồn tại. Khi
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9 được thêm vào
>>> url = "//olympus.realpython.org/profiles/aphrodite"
02, tức là
>>> url = "//olympus.realpython.org/profiles/aphrodite"
03, biến
>>> url = "//olympus.realpython.org/profiles/aphrodite"
04 được gán giá trị
>>> url = "//olympus.realpython.org/profiles/aphrodite"
05

Ký tự tại chỉ mục

>>> url = "//olympus.realpython.org/profiles/aphrodite"
05 của chuỗi
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2 là ký tự xuống dòng [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
08] ngay trước dấu ngoặc nhọn mở [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
09] của thẻ
>>> url = "//olympus.realpython.org/profiles/aphrodite"
10. Điều này có nghĩa là
>>> url = "//olympus.realpython.org/profiles/aphrodite"
11 trả về tất cả HTML bắt đầu bằng dòng mới đó và kết thúc ngay trước thẻ
>>> end_index = html.find[""]
>>> end_index
39
1

Những loại vấn đề này có thể xảy ra theo vô số cách không thể đoán trước. Bạn cần một cách đáng tin cậy hơn để trích xuất văn bản từ HTML

Loại bỏ các quảng cáo

Làm quen với biểu thức chính quy

Cụm từ thông dụng—hay gọi tắt là biểu thức chính quy—là các mẫu mà bạn có thể sử dụng để tìm kiếm văn bản trong một chuỗi. Python hỗ trợ các biểu thức chính quy thông qua mô-đun

>>> url = "//olympus.realpython.org/profiles/aphrodite"
13 của thư viện chuẩn

Ghi chú. Biểu thức chính quy không dành riêng cho Python. Chúng là một khái niệm lập trình chung và được hỗ trợ trong nhiều ngôn ngữ lập trình

Để làm việc với các biểu thức chính quy, điều đầu tiên bạn cần làm là nhập mô-đun

>>> url = "//olympus.realpython.org/profiles/aphrodite"
13

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
2

Biểu thức chính quy sử dụng các ký tự đặc biệt được gọi là siêu ký tự để biểu thị các mẫu khác nhau. Chẳng hạn, ký tự dấu hoa thị [_______5_______15] là viết tắt của 0 hoặc nhiều trường hợp của bất kỳ thứ gì xuất hiện ngay trước dấu hoa thị

Trong ví dụ sau, bạn sử dụng

>>> url = "//olympus.realpython.org/profiles/aphrodite"
16 để tìm bất kỳ văn bản nào trong một chuỗi khớp với một biểu thức chính quy đã cho

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
3

Đối số đầu tiên của

>>> url = "//olympus.realpython.org/profiles/aphrodite"
17 là biểu thức chính quy mà bạn muốn đối sánh và đối số thứ hai là chuỗi để kiểm tra. Trong ví dụ trên, bạn tìm kiếm mẫu
>>> url = "//olympus.realpython.org/profiles/aphrodite"
18 trong chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
19

Biểu thức chính quy

>>> url = "//olympus.realpython.org/profiles/aphrodite"
18 khớp với bất kỳ phần nào của chuỗi bắt đầu bằng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
21, kết thúc bằng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
22 và không có hoặc nhiều phiên bản
>>> url = "//olympus.realpython.org/profiles/aphrodite"
23 giữa hai.
>>> url = "//olympus.realpython.org/profiles/aphrodite"
17 trả về một danh sách tất cả các trận đấu. Chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
19 khớp với mẫu này, vì vậy nó được trả về trong danh sách

Đây là cùng một mẫu được áp dụng cho các chuỗi khác nhau

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
4

Lưu ý rằng nếu không tìm thấy kết quả khớp, thì

>>> url = "//olympus.realpython.org/profiles/aphrodite"
16 trả về một danh sách trống

Khớp mẫu có phân biệt chữ hoa chữ thường. Nếu bạn muốn khớp mẫu này bất kể trường hợp nào, thì bạn có thể chuyển đối số thứ ba có giá trị

>>> url = "//olympus.realpython.org/profiles/aphrodite"
27

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
5

Bạn có thể sử dụng dấu chấm [

>>> url = "//olympus.realpython.org/profiles/aphrodite"
28] để thay thế cho bất kỳ ký tự đơn lẻ nào trong biểu thức chính quy. Chẳng hạn, bạn có thể tìm thấy tất cả các chuỗi chứa các chữ cái
>>> url = "//olympus.realpython.org/profiles/aphrodite"
21 và
>>> url = "//olympus.realpython.org/profiles/aphrodite"
22 được phân tách bằng một ký tự như sau

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
6

Mẫu

>>> url = "//olympus.realpython.org/profiles/aphrodite"
31 bên trong một biểu thức chính quy là viết tắt của bất kỳ ký tự nào được lặp lại nhiều lần. Chẳng hạn, bạn có thể sử dụng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
32 để tìm mọi chuỗi con bắt đầu bằng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
21 và kết thúc bằng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
22, bất kể chữ cái nào—hoặc các chữ cái—nằm ở giữa

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
7

Thông thường, bạn sử dụng

>>> url = "//olympus.realpython.org/profiles/aphrodite"
35 để tìm kiếm một mẫu cụ thể bên trong một chuỗi. Hàm này hơi phức tạp hơn
>>> url = "//olympus.realpython.org/profiles/aphrodite"
17 vì nó trả về một đối tượng có tên là
>>> url = "//olympus.realpython.org/profiles/aphrodite"
37 lưu trữ các nhóm dữ liệu khác nhau. Điều này là do có thể có các kết quả khớp bên trong các kết quả khớp khác và
>>> url = "//olympus.realpython.org/profiles/aphrodite"
35 trả về mọi kết quả có thể

Các chi tiết của

>>> url = "//olympus.realpython.org/profiles/aphrodite"
37 không liên quan ở đây. Hiện tại, chỉ cần biết rằng việc gọi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
40 trên
>>> url = "//olympus.realpython.org/profiles/aphrodite"
37 sẽ trả về kết quả đầu tiên và bao quát nhất, trong hầu hết các trường hợp, đó chính là kết quả bạn muốn

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
8

Có thêm một chức năng trong mô-đun

>>> url = "//olympus.realpython.org/profiles/aphrodite"
13 hữu ích để phân tích văn bản. , viết tắt của từ thay thế, cho phép bạn thay thế văn bản trong một chuỗi khớp với biểu thức chính quy bằng văn bản mới. Nó hoạt động giống như phương thức chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
44

Các đối số được chuyển đến

>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 là biểu thức chính quy, theo sau là văn bản thay thế, theo sau là chuỗi. Đây là một ví dụ

>>>

>>> url = "//olympus.realpython.org/profiles/aphrodite"
9

Có lẽ đó không phải là những gì bạn mong đợi sẽ xảy ra

>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 sử dụng biểu thức chính quy
>>> url = "//olympus.realpython.org/profiles/aphrodite"
47 để tìm và thay thế mọi thứ giữa
>>> url = "//olympus.realpython.org/profiles/aphrodite"
09 đầu tiên và
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6 cuối cùng, kéo dài từ đầu ________5__50 đến cuối
>>> url = "//olympus.realpython.org/profiles/aphrodite"
51. Điều này là do các biểu thức chính quy của Python rất tham lam, nghĩa là chúng cố gắng tìm từ khớp dài nhất có thể khi các ký tự như
>>> url = "//olympus.realpython.org/profiles/aphrodite"
15 được sử dụng

Ngoài ra, bạn có thể sử dụng mẫu so khớp không tham lam

>>> url = "//olympus.realpython.org/profiles/aphrodite"
53, kiểu này hoạt động tương tự như
>>> url = "//olympus.realpython.org/profiles/aphrodite"
15 ngoại trừ việc nó khớp với chuỗi văn bản ngắn nhất có thể

>>>

>>> page = urlopen[url]
0

Lần này,

>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 tìm thấy hai kết quả trùng khớp,
>>> url = "//olympus.realpython.org/profiles/aphrodite"
50 và
>>> url = "//olympus.realpython.org/profiles/aphrodite"
51, đồng thời thay thế chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
58 cho cả hai kết quả trùng khớp

Loại bỏ các quảng cáo

Trích xuất văn bản từ HTML bằng biểu thức chính quy

Được trang bị tất cả những kiến ​​thức này, bây giờ hãy thử phân tích tiêu đề từ một trang hồ sơ khác, bao gồm dòng HTML được viết khá cẩu thả này

>>> page = urlopen[url]
1

Phương thức

>>> start_index = title_index + len[""]
>>> start_index
21
9 sẽ gặp khó khăn khi xử lý sự không nhất quán ở đây, nhưng với việc sử dụng thông minh các biểu thức chính quy, bạn có thể xử lý mã này một cách nhanh chóng và hiệu quả

>>> page = urlopen[url]
2

Hãy xem xét kỹ hơn biểu thức chính quy đầu tiên trong chuỗi

>>> url = "//olympus.realpython.org/profiles/aphrodite"
60 bằng cách chia nó thành ba phần

  1. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    61 khớp với thẻ mở đầu
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    62 trong
    >>> title = html[start_index:end_index]
    >>> title
    'Profile: Aphrodite'
    
    2. Phần
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    64 của mẫu khớp với
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    65 vì
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    35 được gọi với
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    27 và
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    68 khớp với bất kỳ văn bản nào sau
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    65 cho đến phiên bản đầu tiên của
    >>> title = html[start_index:end_index]
    >>> title
    'Profile: Aphrodite'
    
    6

  2. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    71 đối sánh không tham lam tất cả văn bản sau phần mở đầu
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    62, dừng ở đối sánh đầu tiên cho
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    73

  3. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    73 khác với mẫu đầu tiên chỉ ở việc sử dụng ký tự
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    75, vì vậy nó khớp với thẻ đóng
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    76 trong
    >>> title = html[start_index:end_index]
    >>> title
    'Profile: Aphrodite'
    
    2

Biểu thức chính quy thứ hai, chuỗi

>>> url = "//olympus.realpython.org/profiles/aphrodite"
78, cũng sử dụng giá trị không tham lam
>>> url = "//olympus.realpython.org/profiles/aphrodite"
71 để khớp với tất cả các thẻ HTML trong chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
80. Bằng cách thay thế bất kỳ kết quả phù hợp nào bằng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
81,
>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 sẽ xóa tất cả các thẻ và chỉ trả về văn bản

Ghi chú. Quét web bằng Python hoặc bất kỳ ngôn ngữ nào khác có thể rất tẻ nhạt. Không có hai trang web nào được tổ chức theo cùng một cách và HTML thường lộn xộn. Hơn nữa, các trang web thay đổi theo thời gian. Công cụ quét web hoạt động ngày hôm nay không được bảo đảm sẽ hoạt động vào năm tới—hoặc tuần tới, vì vấn đề đó

Biểu thức chính quy là một công cụ mạnh mẽ khi được sử dụng đúng cách. Trong phần giới thiệu này, bạn hầu như không làm trầy xước bề mặt. Để biết thêm về biểu thức chính quy và cách sử dụng chúng, hãy xem loạt bài gồm hai phần Biểu thức chính quy. Regex trong Python

Kiểm tra việc hiểu của bạn

Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn

Tập thể dục. Cạo dữ liệu từ một trang webHiển thị/Ẩn

Viết chương trình lấy toàn bộ HTML từ URL sau

>>>

>>> page = urlopen[url]
3

Sau đó sử dụng

>>> start_index = title_index + len[""]
>>> start_index
21
9 để hiển thị văn bản sau Tên. và Màu yêu thích. [không bao gồm bất kỳ dấu cách nào ở đầu hoặc thẻ HTML ở cuối có thể xuất hiện trên cùng một dòng]

Bạn có thể mở rộng khối bên dưới để xem giải pháp

Giải pháp. Cạo dữ liệu từ một trang webHiển thị/Ẩn

Đầu tiên, nhập hàm

>>> url = "//olympus.realpython.org/profiles/aphrodite"
84 từ mô-đun
>>> url = "//olympus.realpython.org/profiles/aphrodite"
85

>>> page = urlopen[url]
4

Sau đó mở URL và sử dụng phương thức

>>> start_index = title_index + len[""]
>>> start_index
21
5 của đối tượng
>>> start_index = title_index + len[""]
>>> start_index
21
3 được trả về bởi
>>> title_index = html.find[""]
>>> title_index
14
8 để đọc HTML của trang

>>> page = urlopen[url]
5

Phương thức

>>> start_index = title_index + len[""]
>>> start_index
21
5 trả về một chuỗi byte, vì vậy bạn sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
6 để giải mã các byte bằng mã hóa UTF-8

Bây giờ bạn đã có nguồn HTML của trang web dưới dạng một chuỗi được gán cho biến

>>> url = "//olympus.realpython.org/profiles/aphrodite"
91, bạn có thể trích xuất tên và màu sắc yêu thích của Dionysus từ hồ sơ của anh ấy. Cấu trúc HTML cho hồ sơ của Dionysus giống như hồ sơ của Aphrodite mà bạn đã xem trước đó

Bạn có thể lấy tên bằng cách tìm chuỗi

>>> url = "//olympus.realpython.org/profiles/aphrodite"
92 trong văn bản và trích xuất mọi thứ xuất hiện sau lần xuất hiện đầu tiên của chuỗi và trước thẻ HTML tiếp theo. Tức là bạn cần trích xuất mọi thứ sau dấu hai chấm [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
93] và trước dấu ngoặc nhọn đầu tiên [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
09]. Bạn có thể sử dụng kỹ thuật tương tự để trích xuất màu yêu thích

Vòng lặp

>>> url = "//olympus.realpython.org/profiles/aphrodite"
95 sau trích xuất văn bản này cho cả tên và màu sắc yêu thích

>>> page = urlopen[url]
6

Có vẻ như có rất nhiều thứ đang diễn ra trong vòng lặp

>>> url = "//olympus.realpython.org/profiles/aphrodite"
95 này, nhưng chỉ cần một chút tính toán số học để tính toán các chỉ số phù hợp để trích xuất văn bản mong muốn. Đi trước và phá vỡ nó

  1. Bạn sử dụng

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    97 để tìm chỉ mục bắt đầu của chuỗi, hoặc là
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    92 hoặc
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    99, sau đó gán chỉ mục cho
    >>> page = urlopen[url]
    
    00

  2. Vì văn bản cần trích xuất bắt đầu ngay sau dấu hai chấm trong

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    92 hoặc
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    99, nên bạn lấy chỉ mục của ký tự ngay sau dấu hai chấm bằng cách thêm độ dài của chuỗi vào
    >>> page = urlopen[url]
    
    03, sau đó gán kết quả cho
    >>> page = urlopen[url]
    
    04

  3. Bạn tính toán chỉ số kết thúc của văn bản cần trích xuất bằng cách xác định chỉ số của dấu ngoặc nhọn đầu tiên [

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    09] so với
    >>> page = urlopen[url]
    
    04 và gán giá trị này cho
    >>> page = urlopen[url]
    
    07. Sau đó, bạn thêm giá trị đó vào
    >>> page = urlopen[url]
    
    04 và gán kết quả cho
    >>> page = urlopen[url]
    
    09

  4. Bạn trích xuất văn bản bằng cách cắt

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    91 từ
    >>> page = urlopen[url]
    
    04 thành
    >>> page = urlopen[url]
    
    09 và gán chuỗi này cho
    >>> page = urlopen[url]
    
    13

  5. Bạn xóa mọi khoảng trắng ở đầu và cuối của

    >>> page = urlopen[url]
    
    13 bằng cách sử dụng
    >>> page = urlopen[url]
    
    15 và gán kết quả cho
    >>> page = urlopen[url]
    
    16

Ở cuối vòng lặp, bạn sử dụng

>>> page = urlopen[url]
17 để hiển thị văn bản được trích xuất. Đầu ra cuối cùng trông như thế này

>>> page = urlopen[url]
7

Giải pháp này là một trong nhiều giải pháp giải quyết vấn đề này, vì vậy nếu bạn nhận được kết quả tương tự với một giải pháp khác, thì bạn đã làm rất tốt

Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo

Sử dụng Trình phân tích cú pháp HTML để quét web bằng Python

Mặc dù các biểu thức chính quy rất phù hợp để khớp mẫu nói chung, nhưng đôi khi việc sử dụng trình phân tích cú pháp HTML được thiết kế rõ ràng để phân tích các trang HTML sẽ dễ dàng hơn. Có nhiều công cụ Python được viết cho mục đích này, nhưng thư viện Beautiful Soup là một công cụ tốt để bắt đầu

Cài Đặt Súp Đẹp

Để cài đặt Beautiful Soup, bạn có thể chạy lệnh sau trong thiết bị đầu cuối của mình

>>> page = urlopen[url]
8

Với lệnh này, bạn đang cài đặt phiên bản Beautiful Soup mới nhất vào môi trường Python toàn cầu của mình

Loại bỏ các quảng cáo

Tạo một đối tượng
>>> page = urlopen[url]
18

Nhập chương trình sau vào cửa sổ soạn thảo mới

>>> page = urlopen[url]
9

Chương trình này thực hiện ba điều

  1. Mở URL

    >>> page = urlopen[url]
    
    19 bằng cách sử dụng
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    8 từ mô-đun
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    7

  2. Đọc HTML từ trang dưới dạng chuỗi và gán nó cho biến

    >>> title = html[start_index:end_index]
    >>> title
    'Profile: Aphrodite'
    
    2

  3. Tạo một đối tượng

    >>> page = urlopen[url]
    
    18 và gán nó cho biến
    >>> page = urlopen[url]
    
    24

Đối tượng

>>> page = urlopen[url]
18 được gán cho
>>> page = urlopen[url]
24 được tạo với hai đối số. Đối số đầu tiên là HTML sẽ được phân tích cú pháp và đối số thứ hai, chuỗi
>>> page = urlopen[url]
27, cho đối tượng biết trình phân tích cú pháp nào sẽ sử dụng ở hậu trường.
>>> page = urlopen[url]
27 đại diện cho trình phân tích cú pháp HTML tích hợp của Python

Sử dụng một đối tượng
>>> page = urlopen[url]
18

Lưu và chạy chương trình trên. Khi nó chạy xong, bạn có thể sử dụng biến

>>> page = urlopen[url]
24 trong cửa sổ tương tác để phân tích nội dung của
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2 theo nhiều cách khác nhau

Ghi chú. Nếu bạn không sử dụng IDLE, thì bạn có thể chạy chương trình của mình với cờ

>>> page = urlopen[url]
32 để vào chế độ tương tác. Thứ gì đó như
>>> page = urlopen[url]
33 trước tiên sẽ chạy chương trình của bạn và sau đó đưa bạn vào một REPL nơi bạn có thể khám phá các đối tượng của mình

Ví dụ: các đối tượng

>>> page = urlopen[url]
18 có phương thức
>>> page = urlopen[url]
35 mà bạn có thể sử dụng để trích xuất tất cả văn bản khỏi tài liệu và tự động xóa mọi thẻ HTML

Nhập mã sau vào cửa sổ tương tác của IDLE hoặc ở cuối mã trong trình chỉnh sửa của bạn

>>>

>>> page

0

Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự xuống dòng trong văn bản của tài liệu HTML. Bạn có thể loại bỏ chúng bằng phương pháp chuỗi

>>> url = "//olympus.realpython.org/profiles/aphrodite"
44 nếu bạn cần

Thông thường, bạn chỉ cần lấy văn bản cụ thể từ tài liệu HTML. Trước tiên, sử dụng Beautiful Soup để trích xuất văn bản và sau đó sử dụng phương pháp chuỗi

>>> start_index = title_index + len[""]
>>> start_index
21
9 đôi khi dễ dàng hơn so với làm việc với các biểu thức thông thường

Tuy nhiên, những lần khác, chính các thẻ HTML là các yếu tố chỉ ra dữ liệu bạn muốn truy xuất. Chẳng hạn, có lẽ bạn muốn truy xuất URL cho tất cả các hình ảnh trên trang. Các liên kết này được chứa trong thuộc tính

>>> page = urlopen[url]
38 của thẻ HTML
>>> page = urlopen[url]
39

Trong trường hợp này, bạn có thể sử dụng

>>> page = urlopen[url]
40 để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó

>>>

>>> page

1

Điều này trả về một danh sách tất cả các thẻ

>>> page = urlopen[url]
39 trong tài liệu HTML. Các đối tượng trong danh sách trông giống như chúng có thể là các chuỗi đại diện cho các thẻ, nhưng chúng thực sự là các thể hiện của đối tượng
>>> page = urlopen[url]
42 do Beautiful Soup cung cấp.
>>> page = urlopen[url]
42 đối tượng cung cấp một giao diện đơn giản để làm việc với thông tin mà chúng chứa

Bạn có thể khám phá điều này một chút bằng cách lần đầu tiên giải nén các đối tượng

>>> page = urlopen[url]
42 từ danh sách

>>>

>>> page

2

Mỗi đối tượng

>>> page = urlopen[url]
42 có một thuộc tính
>>> page = urlopen[url]
46 trả về một chuỗi chứa loại thẻ HTML

>>>

>>> page

3

Bạn có thể truy cập các thuộc tính HTML của đối tượng

>>> page = urlopen[url]
42 bằng cách đặt tên của chúng giữa các dấu ngoặc vuông, giống như thể các thuộc tính là khóa trong từ điển

Ví dụ: thẻ

>>> page = urlopen[url]
48 có một thuộc tính duy nhất,
>>> page = urlopen[url]
38, với giá trị
>>> page = urlopen[url]
50. Tương tự như vậy, một thẻ HTML chẳng hạn như liên kết
>>> page = urlopen[url]
51 có hai thuộc tính,
>>> page = urlopen[url]
52 và
>>> page = urlopen[url]
53

Để lấy nguồn của các hình ảnh trong trang hồ sơ Dionysus, bạn truy cập thuộc tính

>>> page = urlopen[url]
38 bằng cách sử dụng ký hiệu từ điển đã đề cập ở trên

>>>

>>> page

4

Một số thẻ trong tài liệu HTML có thể được truy cập bởi các thuộc tính của đối tượng

>>> page = urlopen[url]
42. Ví dụ: để lấy thẻ
>>> end_index = html.find[""]
>>> end_index
39
0 trong tài liệu, bạn có thể sử dụng thuộc tính
>>> page = urlopen[url]
57

>>>

>>> page

5

Nếu bạn xem nguồn của hồ sơ Dionysus bằng cách điều hướng đến trang hồ sơ, nhấp chuột phải vào trang và chọn Xem nguồn trang, thì bạn sẽ nhận thấy rằng thẻ

>>> end_index = html.find[""]
>>> end_index
39
0 được viết hoa toàn bộ và có khoảng trắng

Beautiful Soup tự động dọn sạch các thẻ cho bạn bằng cách loại bỏ khoảng trống thừa trong thẻ mở và dấu gạch chéo lên phía trước không liên quan [_______5_______75] trong thẻ đóng

Bạn cũng có thể chỉ truy xuất chuỗi giữa các thẻ tiêu đề với thuộc tính

>>> page = urlopen[url]
60 của đối tượng
>>> page = urlopen[url]
42

>>>

>>> page

6

Một trong những tính năng của Beautiful Soup là khả năng tìm kiếm các loại thẻ cụ thể có thuộc tính khớp với các giá trị nhất định. Ví dụ: nếu bạn muốn tìm tất cả các thẻ

>>> page = urlopen[url]
39 có thuộc tính
>>> page = urlopen[url]
38 bằng giá trị
>>> page = urlopen[url]
64, thì bạn có thể cung cấp đối số bổ sung sau cho
>>> page = urlopen[url]
65

>>>

>>> page

7

Ví dụ này hơi tùy ý và tính hữu ích của kỹ thuật này có thể không rõ ràng từ ví dụ. Nếu bạn dành thời gian duyệt các trang web khác nhau và xem nguồn trang của chúng, thì bạn sẽ nhận thấy rằng nhiều trang web có cấu trúc HTML cực kỳ phức tạp

Khi cạo dữ liệu từ các trang web bằng Python, bạn thường quan tâm đến các phần cụ thể của trang. Bằng cách dành thời gian xem qua tài liệu HTML, bạn có thể xác định các thẻ có thuộc tính duy nhất mà bạn có thể sử dụng để trích xuất dữ liệu mình cần

Sau đó, thay vì dựa vào các biểu thức chính quy phức tạp hoặc sử dụng

>>> start_index = title_index + len[""]
>>> start_index
21
9 để tìm kiếm trong tài liệu, bạn có thể truy cập trực tiếp vào thẻ cụ thể mà bạn quan tâm và trích xuất dữ liệu bạn cần

Trong một số trường hợp, bạn có thể thấy rằng Beautiful Soup không cung cấp chức năng mà bạn cần. Thư viện hơi phức tạp hơn để bắt đầu nhưng cung cấp tính linh hoạt hơn nhiều so với Beautiful Soup để phân tích tài liệu HTML. Bạn có thể muốn kiểm tra nó sau khi cảm thấy thoải mái khi sử dụng Beautiful Soup

Ghi chú. Các trình phân tích cú pháp HTML như Beautiful Soup có thể giúp bạn tiết kiệm rất nhiều thời gian và công sức khi định vị dữ liệu cụ thể trong các trang web. Tuy nhiên, đôi khi HTML được viết kém và lộn xộn đến mức ngay cả một trình phân tích cú pháp tinh vi như Beautiful Soup cũng không thể diễn giải đúng các thẻ HTML

Trong trường hợp này, bạn thường phải sử dụng

>>> start_index = title_index + len[""]
>>> start_index
21
9 và các kỹ thuật biểu thức chính quy để cố gắng phân tích thông tin mà bạn cần

Beautiful Soup rất tốt để thu thập dữ liệu từ HTML của trang web, nhưng nó không cung cấp bất kỳ cách nào để làm việc với biểu mẫu HTML. Ví dụ: nếu bạn cần tìm kiếm một số truy vấn trên một trang web và sau đó thu thập kết quả, thì một mình Beautiful Soup sẽ không giúp bạn tiến xa được

Loại bỏ các quảng cáo

Kiểm tra việc hiểu của bạn

Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn

Tập thể dục. Phân tích cú pháp HTML bằng Beautiful SoupHiển thị/Ẩn

Viết chương trình lấy toàn bộ HTML từ trang tại URL

>>> page = urlopen[url]
68

Sử dụng Beautiful Soup, in ra danh sách tất cả các liên kết trên trang bằng cách tìm các thẻ HTML có tên

>>> page = urlopen[url]
69 và truy xuất giá trị được lấy bởi thuộc tính
>>> page = urlopen[url]
52 của mỗi thẻ

Đầu ra cuối cùng sẽ trông như thế này

>>> page

8

Đảm bảo rằng bạn chỉ có một dấu gạch chéo [

>>> url = "//olympus.realpython.org/profiles/aphrodite"
75] giữa URL cơ sở và URL tương đối

Bạn có thể mở rộng khối bên dưới để xem giải pháp

Giải pháp. Phân tích cú pháp HTML bằng Beautiful SoupHiển thị/Ẩn

Đầu tiên, nhập hàm

>>> url = "//olympus.realpython.org/profiles/aphrodite"
84 từ mô-đun
>>> url = "//olympus.realpython.org/profiles/aphrodite"
85 và lớp
>>> page = urlopen[url]
18 từ gói
>>> page = urlopen[url]
75

>>> page

9

Mỗi URL liên kết trên trang

>>> page = urlopen[url]
76 là một URL tương đối, vì vậy hãy tạo một biến
>>> page = urlopen[url]
77 với URL cơ sở của trang web

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
0

Bạn có thể tạo một URL đầy đủ bằng cách nối

>>> page = urlopen[url]
77 với một URL tương đối

Bây giờ hãy mở trang

>>> page = urlopen[url]
76 bằng
>>> title_index = html.find[""]
>>> title_index
14
8 và sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
5 để lấy mã nguồn HTML

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
1

Với nguồn HTML được tải xuống và giải mã, bạn có thể tạo một đối tượng

>>> page = urlopen[url]
18 mới để phân tích cú pháp HTML

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
2

>>> page = urlopen[url]
83 trả về danh sách tất cả các liên kết trong mã nguồn HTML. Bạn có thể lặp lại danh sách này để in ra tất cả các liên kết trên trang web

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
3

Bạn có thể truy cập URL tương đối cho mỗi liên kết thông qua chỉ số phụ

>>> page = urlopen[url]
84. Nối giá trị này với
>>> page = urlopen[url]
77 để tạo ra toàn bộ
>>> page = urlopen[url]
86

Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo

Tương tác với các biểu mẫu HTML

Mô-đun

>>> title_index = html.find[""]
>>> title_index
14
6 mà bạn đã làm việc cho đến nay trong hướng dẫn này rất phù hợp để yêu cầu nội dung của một trang web. Tuy nhiên, đôi khi bạn cần tương tác với một trang web để lấy nội dung bạn cần. Ví dụ: bạn có thể cần gửi biểu mẫu hoặc nhấp vào nút để hiển thị nội dung ẩn

Ghi chú. Hướng dẫn này được chuyển thể từ chương “Tương tác với Web” trong Python Basics. Giới thiệu thực tế về Python 3. Nếu bạn thích những gì bạn đang đọc, thì hãy nhớ xem phần còn lại của cuốn sách

Thư viện chuẩn Python không cung cấp phương tiện tích hợp sẵn để làm việc với các trang web một cách tương tác, nhưng nhiều gói của bên thứ ba có sẵn từ PyPI. Trong số này, MechanicalSoup là một gói phổ biến và tương đối dễ sử dụng

Về bản chất, MechanicalSoup cài đặt cái được gọi là trình duyệt không đầu, là trình duyệt web không có giao diện người dùng đồ họa. Trình duyệt này được điều khiển theo chương trình thông qua chương trình Python

Cài đặt MechanicalSoup

Bạn có thể cài đặt MechanicalSoup với

>>> page = urlopen[url]
88 trong thiết bị đầu cuối của mình

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
4

Bạn sẽ cần đóng và khởi động lại phiên IDLE của mình để MechanicalSoup tải và được nhận dạng sau khi cài đặt

Tạo một đối tượng
>>> page = urlopen[url]
89

Nhập nội dung sau vào cửa sổ tương tác của IDLE

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
5

>>> page = urlopen[url]
89 đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL tới phương thức
>>> page = urlopen[url]
91 của chúng

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
6

>>> page = urlopen[url]
92 là một đối tượng
>>> page = urlopen[url]
93 lưu trữ phản hồi từ việc yêu cầu URL từ trình duyệt

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
7

Số

>>> page = urlopen[url]
94 đại diện cho mã trạng thái được yêu cầu trả về. Mã trạng thái của
>>> page = urlopen[url]
94 có nghĩa là yêu cầu đã thành công. Một yêu cầu không thành công có thể hiển thị mã trạng thái là
>>> page = urlopen[url]
96 nếu URL không tồn tại hoặc
>>> page = urlopen[url]
97 nếu có lỗi máy chủ khi thực hiện yêu cầu

MechanicalSoup sử dụng Beautiful Soup để phân tích cú pháp HTML từ yêu cầu và

>>> page = urlopen[url]
92 có thuộc tính
>>> page = urlopen[url]
99 đại diện cho đối tượng
>>> page = urlopen[url]
18

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
8

Bạn có thể xem HTML bằng cách kiểm tra thuộc tính

>>> page = urlopen[url]
99

>>>

>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
9

Lưu ý rằng trang này có một

>>> page

02 trên đó với các phần tử
>>> page

03 cho tên người dùng và mật khẩu

Loại bỏ các quảng cáo

Gửi biểu mẫu với MechanicalSoup

Mở trang

>>> page

04 từ ví dụ trước trong trình duyệt và tự xem trang đó trước khi tiếp tục

Hãy thử nhập kết hợp tên người dùng và mật khẩu ngẫu nhiên. Nếu bạn đoán sai, thì thông báo Sai tên người dùng hoặc mật khẩu. được hiển thị ở dưới cùng của trang

Tuy nhiên, nếu bạn cung cấp thông tin đăng nhập chính xác thì bạn sẽ được chuyển hướng đến trang

>>> page = urlopen[url]
76

UsernamePassword

>>> page

06
>>> page

07

Trong ví dụ tiếp theo, bạn sẽ thấy cách sử dụng MechanicalSoup để điền và gửi biểu mẫu này bằng Python

Phần quan trọng của mã HTML là biểu mẫu đăng nhập—nghĩa là mọi thứ bên trong thẻ

>>> page

02.
>>> page

02 trên trang này có thuộc tính
>>> page

10 được đặt thành
>>> page

11. Biểu mẫu này chứa hai phần tử
>>> page

03, một phần tử có tên là
>>> page

13 và phần tử kia có tên là
>>> page

14. Phần tử
>>> page

03 thứ ba là nút Gửi

Bây giờ bạn đã biết cấu trúc cơ bản của biểu mẫu đăng nhập, cũng như thông tin đăng nhập cần thiết để đăng nhập, hãy xem một chương trình điền vào biểu mẫu và gửi biểu mẫu đó

Trong cửa sổ soạn thảo mới, gõ vào chương trình sau

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
0

Lưu tệp và nhấn F5 để chạy tệp. Để xác nhận rằng bạn đã đăng nhập thành công, hãy nhập thông tin sau vào cửa sổ tương tác.

>>>

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
1

Bây giờ chia nhỏ ví dụ trên

  1. Bạn tạo một phiên bản

    >>> page = urlopen[url]
    
    89 và sử dụng nó để yêu cầu URL
    >>> page
    
    
    17. Bạn gán nội dung HTML của trang cho biến
    >>> page
    
    
    18 bằng cách sử dụng thuộc tính
    >>> page = urlopen[url]
    
    99

  2. >>> page
    
    
    20 trả về danh sách tất cả các phần tử
    >>> page
    
    
    02 trên trang. Vì trang chỉ có một phần tử
    >>> page
    
    
    02 nên bạn có thể truy cập biểu mẫu bằng cách truy xuất phần tử tại chỉ mục
    >>> page
    
    
    23 của danh sách. Khi chỉ có một biểu mẫu trên một trang, bạn cũng có thể sử dụng
    >>> page
    
    
    24. Hai dòng tiếp theo chọn đầu vào tên người dùng và mật khẩu và đặt giá trị của chúng lần lượt là
    >>> page
    
    
    25 và
    >>> page
    
    
    26

  3. Bạn gửi biểu mẫu với

    >>> page
    
    
    27. Lưu ý rằng bạn truyền hai đối số cho phương thức này, đối tượng
    >>> page
    
    
    28 và URL của
    >>> page
    
    
    29 mà bạn truy cập thông qua
    >>> page
    
    
    30

Trong cửa sổ tương tác, bạn xác nhận rằng nội dung gửi đã được chuyển hướng thành công đến trang

>>> page = urlopen[url]
76. Nếu có gì đó không ổn, thì giá trị của
>>> page

32 vẫn sẽ là
>>> page

33

Ghi chú. Tin tặc có thể sử dụng các chương trình tự động như chương trình ở trên để bắt buộc đăng nhập bằng cách nhanh chóng thử nhiều tên người dùng và mật khẩu khác nhau cho đến khi chúng tìm thấy sự kết hợp hoạt động

Bên cạnh việc điều này rất bất hợp pháp, hầu hết tất cả các trang web ngày nay đều khóa bạn và báo cáo địa chỉ IP của bạn nếu họ thấy bạn thực hiện quá nhiều yêu cầu không thành công, vì vậy đừng thử

Bây giờ bạn đã có bộ biến

>>> page

34, đã đến lúc lấy URL cho mỗi liên kết trên trang
>>> page = urlopen[url]
76 theo chương trình

Để làm điều này, bạn sử dụng lại

>>> page

36, lần này chuyển chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
21 để chọn tất cả các phần tử neo
>>> page

38 trên trang

>>>

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
2

Bây giờ bạn có thể lặp qua từng liên kết và in thuộc tính

>>> page = urlopen[url]
52

>>>

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
3

Các URL có trong mỗi thuộc tính

>>> page = urlopen[url]
52 là các URL tương đối, không hữu ích lắm nếu bạn muốn điều hướng đến chúng sau này bằng MechanicalSoup. Nếu bạn tình cờ biết URL đầy đủ, thì bạn có thể chỉ định phần cần thiết để tạo URL đầy đủ

Trong trường hợp này, URL cơ sở chỉ là

>>> page

41. Sau đó, bạn có thể nối URL cơ sở với các URL tương đối được tìm thấy trong thuộc tính
>>> page = urlopen[url]
38

>>>

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
4

Bạn có thể làm được rất nhiều việc chỉ với

>>> page = urlopen[url]
91,
>>> page

36 và
>>> page

45. Điều đó nói rằng, MechanicalSoup có khả năng nhiều hơn nữa. Để tìm hiểu thêm về MechanicalSoup, hãy xem tài liệu chính thức

Loại bỏ các quảng cáo

Kiểm tra việc hiểu của bạn

Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn

Tập thể dục. Gửi biểu mẫu bằng MechanicalSoupHiển thị/Ẩn

Sử dụng MechanicalSoup để cung cấp đúng tên người dùng [

>>> page

06] và mật khẩu [
>>> page

07] vào biểu mẫu đăng nhập có tại URL
>>> page

17

Sau khi biểu mẫu được gửi, hãy hiển thị tiêu đề của trang hiện tại để xác định rằng bạn đã được chuyển hướng đến trang

>>> page = urlopen[url]
76

Chương trình của bạn sẽ in văn bản

>>> page

50

Bạn có thể mở rộng khối bên dưới để xem giải pháp

Giải pháp. Gửi biểu mẫu bằng MechanicalSoupHiển thị/Ẩn

Đầu tiên, nhập gói

>>> page

51 và tạo đối tượng
>>> page

52

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
5

Trỏ trình duyệt đến trang đăng nhập bằng cách chuyển URL tới

>>> page

53 và lấy HTML có thuộc tính
>>> page = urlopen[url]
99

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
6

>>> page

18 là một trường hợp
>>> page = urlopen[url]
18. Vì trang này chỉ có một biểu mẫu duy nhất trên đó nên bạn có thể truy cập biểu mẫu qua
>>> page

24. Sử dụng
>>> page

36, chọn đầu vào tên người dùng và mật khẩu và điền chúng bằng tên người dùng
>>> page

25 và mật khẩu
>>> page

26

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
7

Bây giờ biểu mẫu đã được điền đầy đủ, bạn có thể gửi nó cùng với

>>> page

27

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
8

Nếu bạn điền đúng tên người dùng và mật khẩu vào biểu mẫu, thì

>>> page

34 thực sự sẽ trỏ đến trang
>>> page = urlopen[url]
76. Bạn có thể xác nhận điều này bằng cách in tiêu đề của trang được gán cho
>>> page

64

>>> print[html]


Profile: Aphrodite





Name: Aphrodite



Favorite animal: Dove

Favorite color: Red

Hometown: Mount Olympus
9

Bạn sẽ thấy văn bản sau được hiển thị

>>> title_index = html.find[""]
>>> title_index
14
0

Nếu thay vào đó, bạn thấy văn bản

>>> page

65 hoặc nội dung nào khác, thì việc gửi biểu mẫu không thành công

Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo

Tương tác với các trang web trong thời gian thực

Đôi khi bạn muốn có thể lấy dữ liệu theo thời gian thực từ một trang web cung cấp thông tin được cập nhật liên tục

Vào những ngày đen tối trước khi bạn học lập trình Python, bạn phải ngồi trước trình duyệt, nhấp vào nút Làm mới để tải lại trang mỗi khi bạn muốn kiểm tra xem có nội dung cập nhật hay không. Nhưng bây giờ bạn có thể tự động hóa quy trình này bằng cách sử dụng phương thức

>>> page = urlopen[url]
91 của đối tượng MechanicalSoup
>>> page = urlopen[url]
89

Mở trình duyệt bạn chọn và điều hướng đến URL

>>> page

68

Trang

>>> page

69 này mô phỏng trò tung xúc xắc sáu mặt, cập nhật kết quả mỗi khi bạn làm mới trình duyệt. Dưới đây, bạn sẽ viết một chương trình liên tục quét trang để có kết quả mới

Điều đầu tiên bạn cần làm là xác định phần tử nào trên trang chứa kết quả của việc tung xúc xắc. Thực hiện việc này ngay bây giờ bằng cách nhấp chuột phải vào bất kỳ đâu trên trang và chọn Xem nguồn trang. Hơn một nửa mã HTML là một thẻ

>>> page

70 trông như thế này

>>> title_index = html.find[""]
>>> title_index
14
1

Văn bản của thẻ

>>> page

70 có thể khác đối với bạn, nhưng đây là thành phần trang bạn cần để trích xuất kết quả

Ghi chú. Đối với ví dụ này, bạn có thể dễ dàng kiểm tra xem chỉ có một phần tử trên trang có

>>> page

72. Mặc dù thuộc tính
>>> page

73 được cho là duy nhất nhưng trên thực tế, bạn phải luôn kiểm tra xem phần tử bạn quan tâm có được xác định duy nhất không

Bây giờ hãy bắt đầu bằng cách viết một chương trình đơn giản mở trang

>>> page

69, loại bỏ kết quả và in nó ra bàn điều khiển

>>> title_index = html.find[""]
>>> title_index
14
2

Ví dụ này sử dụng phương thức

>>> page

36 của đối tượng
>>> page = urlopen[url]
18 để tìm phần tử có
>>> page

77. Chuỗi
>>> page

78 mà bạn chuyển đến
>>> page

36, sử dụng bộ chọn CSS ID
>>> page

80 để cho biết rằng
>>> page

81 là một giá trị
>>> page

73

Để định kỳ nhận được kết quả mới, bạn sẽ cần tạo một vòng lặp tải trang ở mỗi bước. Vì vậy, mọi thứ bên dưới dòng

>>> page

83 trong đoạn mã trên cần phải nằm trong phần thân của vòng lặp

Đối với ví dụ này, bạn muốn tung xúc xắc bốn lần cách nhau mười giây. Để làm điều đó, dòng mã cuối cùng của bạn cần yêu cầu Python tạm dừng chạy trong mười giây. Bạn có thể làm điều này với

>>> page

84 từ mô-đun
>>> page

85 của Python. Phương thức
>>> page

84 lấy một đối số duy nhất biểu thị lượng thời gian để ngủ tính bằng giây

Đây là một ví dụ minh họa cách hoạt động của

>>> page

87

>>> title_index = html.find[""]
>>> title_index
14
3

Khi bạn chạy mã này, bạn sẽ thấy thông báo

>>> page

88 không được hiển thị cho đến khi năm giây trôi qua kể từ khi hàm
>>> page = urlopen[url]
17 đầu tiên được thực thi

Đối với ví dụ cuộn xúc xắc, bạn sẽ cần chuyển số

>>> page

90 đến
>>> page

87. Đây là chương trình cập nhật

>>> title_index = html.find[""]
>>> title_index
14
4

Khi chạy chương trình, bạn sẽ thấy ngay kết quả đầu tiên được in ra bàn điều khiển. Sau mười giây, kết quả thứ hai được hiển thị, sau đó là kết quả thứ ba và cuối cùng là kết quả thứ tư. Điều gì xảy ra sau khi kết quả thứ tư được in ra?

Chương trình tiếp tục chạy thêm mười giây nữa trước khi dừng lại. Đó là một sự lãng phí thời gian. Bạn có thể ngăn nó làm điều này bằng cách sử dụng câu lệnh

>>> page

92 để chạy
>>> page

93 chỉ cho ba yêu cầu đầu tiên

>>> title_index = html.find[""]
>>> title_index
14
5

Với các kỹ thuật như thế này, bạn có thể thu thập dữ liệu từ các trang web cập nhật dữ liệu của họ theo định kỳ. Tuy nhiên, bạn nên lưu ý rằng việc yêu cầu một trang nhiều lần liên tiếp có thể bị coi là hành vi sử dụng trang web đáng ngờ hoặc thậm chí là độc hại

Quan trọng. Hầu hết các trang web xuất bản tài liệu Điều khoản sử dụng. Bạn thường có thể tìm thấy một liên kết đến nó ở chân trang của trang web

Luôn đọc tài liệu này trước khi cố gắng lấy dữ liệu từ một trang web. Nếu bạn không thể tìm thấy Điều khoản sử dụng, hãy thử liên hệ với chủ sở hữu trang web và hỏi họ xem họ có bất kỳ chính sách nào liên quan đến khối lượng yêu cầu không

Việc không tuân thủ Điều khoản sử dụng có thể dẫn đến việc IP của bạn bị chặn, vì vậy hãy cẩn thận

Thậm chí có thể làm sập máy chủ với số lượng yêu cầu quá nhiều, vì vậy bạn có thể tưởng tượng rằng nhiều trang web lo ngại về số lượng yêu cầu đến máy chủ của họ. Luôn kiểm tra Điều khoản sử dụng và tôn trọng khi gửi nhiều yêu cầu đến một trang web

Loại bỏ các quảng cáo

Phần kết luận

Mặc dù có thể phân tích cú pháp dữ liệu từ Web bằng các công cụ trong thư viện chuẩn của Python, nhưng có nhiều công cụ trên PyPI có thể giúp đơn giản hóa quy trình

Trong hướng dẫn này, bạn đã học cách

  • Yêu cầu một trang web bằng mô-đun
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    6 tích hợp sẵn của Python
  • Phân tích cú pháp HTML bằng Beautiful Soup
  • Tương tác với các biểu mẫu web bằng MechanicalSoup
  • Liên tục yêu cầu dữ liệu từ một trang web để kiểm tra các bản cập nhật

Viết các chương trình quét web tự động rất thú vị và Internet không thiếu nội dung có thể dẫn đến tất cả các loại dự án thú vị

Chỉ cần nhớ rằng, không phải ai cũng muốn bạn lấy dữ liệu từ máy chủ web của họ. Luôn kiểm tra Điều khoản sử dụng của trang web trước khi bạn bắt đầu thu thập dữ liệu và tôn trọng cách bạn tính thời gian cho các yêu cầu web của mình để bạn không làm ngập máy chủ với lưu lượng truy cập

Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để thu thập và phân tích dữ liệu từ Web

Tài nguyên bổ sung

Để biết thêm thông tin về quét web bằng Python, hãy xem các tài nguyên sau

  • súp đẹp. Xây dựng một Web Scraper với Python
  • Tích hợp API trong Python
  • Python & API. Một kết hợp chiến thắng để đọc dữ liệu công khai

Ghi chú. Nếu bạn thích những gì bạn học được trong ví dụ này từ Python Basics. Giới thiệu thực tế về Python 3, thì hãy nhớ xem phần còn lại của cuốn sách

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về David Amos

David là một nhà văn, lập trình viên và nhà toán học đam mê khám phá toán học thông qua mã

» Thông tin thêm về David

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Geir Arne

Joanna

Gia-cốp

kate

Martin

Philipp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Làm cách nào để trích xuất giá trị từ HTML trong python?

Các bước để cạo bất kỳ trang web nào . Chúng ta có thể làm điều này bằng cách sử dụng thư viện Request của Python. Tìm nạp và phân tích dữ liệu bằng Beautifulsoup và duy trì dữ liệu trong một số cấu trúc dữ liệu như Dict hoặc List. Sending an HTTP GET request to the URL of the webpage that you want to scrape, which will respond with HTML content. We can do this by using the Request library of Python. Fetching and parsing the data using Beautifulsoup and maintain the data in some data structure such as Dict or List.

Làm cách nào để đưa đầu vào từ trang HTML sang python?

Có hai phương pháp để giải quyết vấn đề của bạn. .
Lấy giá trị đầu vào bằng phương thức nhập của python
Lấy đầu vào từ biểu mẫu HTML. Trong trường hợp này, trước tiên, bạn cần chạy một máy chủ cục bộ. Để làm điều đó, bạn có thể sử dụng các khung python khác nhau. Ví dụ: bình, chai, Django [Tôi đang sử dụng bình ở đây để hiển thị ví dụ. ]

Làm cách nào để chuyển đổi mã HTML thành văn bản trong python?

Nhiều khi làm việc với tự động hóa web, chúng tôi cần chuyển đổi mã HTML thành Văn bản. Điều này có thể được thực hiện bằng cách sử dụng BeautifulSoup . Mô-đun này cung cấp hàm get_text[] lấy HTML làm đầu vào và trả về văn bản làm đầu ra.

Chủ Đề