Computer >> Máy Tính >  >> Lập trình >> Python

Làm thế nào để phân tích cú pháp các trang HTML để tìm nạp các bảng HTML bằng Python?

Vấn đề

Bạn cần trích xuất các bảng HTML từ một trang web.

Giới thiệu

Internet, và World Wide Web (WWW), là nguồn thông tin nổi bật nhất hiện nay. Có quá nhiều thông tin ngoài kia, thật khó để chọn nội dung từ rất nhiều tùy chọn. Hầu hết thông tin đó có thể truy xuất được thông qua HTTP.

Nhưng chúng tôi cũng có thể thực hiện các thao tác này theo chương trình để truy xuất và xử lý thông tin tự động.

Python cho phép chúng ta làm điều này bằng cách sử dụng thư viện tiêu chuẩn của nó, một ứng dụng khách HTTP, nhưng mô-đun yêu cầu giúp lấy thông tin các trang web rất dễ dàng.

Trong bài đăng này, chúng ta sẽ xem cách phân tích cú pháp qua các trang HTML để trích xuất các bảng HTML được nhúng trong các trang.

Cách thực hiện ..

1.Chúng tôi sẽ sử dụng các yêu cầu, gấu trúc, beautifulsoup4 và lập bảng các gói. Hãy cài đặt chúng trên hệ thống của bạn nếu chúng bị thiếu. Nếu bạn không chắc chắn, vui lòng sử dụng tính năng đóng băng pip để xác thực.

 nhập yêu cầu nhập gấu trúc dưới dạng pdfrom lập bảng nhập khẩu 

2.Chúng tôi sẽ sử dụng https://www.tutorialspoint.com/python/python_basic_operators.htm để đọc qua trang và in ra tất cả các trang HTML được nhúng bên trong chúng.

 # set urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm" 

3.Chúng tôi sẽ đưa ra yêu cầu tới máy chủ và xem phản hồi.

 # Thực hiện yêu cầu tới serverresponse =request.get (site_url) # Kiểm tra bản phản hồi (f "*** Phản hồi cho {site_url} là {response.status_code}") 

4.Vâng, mã phản hồi 200 - đại diện cho phản hồi trở lại từ máy chủ là thành công. Vì vậy, bây giờ chúng tôi sẽ kiểm tra tiêu đề yêu cầu, tiêu đề phản hồi cũng như 100 văn bản đầu tiên được máy chủ trả về.

 # Kiểm tra tiêu đề yêu cầu (f "*** In tiêu đề yêu cầu - \ n {response.request.headers}") # Kiểm tra tiêu đề phản hồi (f "*** In tiêu đề yêu cầu - \ n {phản hồi .headers} ") # kiểm tra nội dung của resultsprint (f" *** Truy cập 100 / {len (response.text)} ký tự đầu tiên - \ n \ n {response.text [:100]} ")  

Đầu ra

 *** In tiêu đề yêu cầu - {'User-Agent':'python-Request / 2.24.0', 'Accept-Encoding':'gzip, deflate', 'Accept':'* / *', 'Kết nối':'keep-living'} *** In tiêu đề yêu cầu - {'Content-Encoding':'gzip', 'Accept-Ranges':'bytes', 'Age':'213246', 'Cache- Điều khiển ':' max-age =2592000 ',' Loại-Nội dung ':' text / html; charset =UTF-8 ',' Ngày ':' Thứ Ba, ngày 20 tháng 10 năm 2020 09:45:18 GMT ',' Hết hạn ':' Thứ Năm, ngày 19 tháng 11 năm 2020 09:45:18 GMT ',' Sửa đổi lần cuối ':' Thứ bảy, ngày 17 tháng 10 năm 2020 22:31:13 GMT ',' Máy chủ ':' ECS (meb / A77C) ',' Nghiêm ngặt-Vận chuyển-Bảo mật ':' max-age =63072000; includeSubdomains ',' Vary ':' Accept-Encoding ',' X-Cache ':' HIT ',' X-Content-Type-Options ':' nosniff ',' X-Frame-Options ':' SAMEORIGIN ',' X-XSS-Bảo vệ ':' 1; mode =block ',' Content-Length ':' 8863 '} *** Truy cập 100/37624 ký tự đầu tiên -     Python - Cơ bản Người điều hành - Điểm hướng dẫn  

5. Bây giờ chúng tôi sẽ sử dụng BeautifulSoup để phân tích cú pháp thông qua HTML.

 # Phân tích cú pháp các trang HTML từ nhập 4 lần BeautifulSouptutorialpoints_page =BeautifulSoup (response.text, 'html.parser') print (f "*** Tiêu đề của trang là - {tutorialpoints_page.title}") # Bạn có thể trích xuất tiêu đề trang dưới dạng chuỗi cũng như dấu hiệu (f "*** Tiêu đề của trang là - {tutorialpoints_page.title.string}") 

6. Ồ, hầu hết các bảng sẽ có tiêu đề được xác định trong các thẻ h2, h3, h4, h5 hoặc h6. Đầu tiên chúng tôi xác định các thẻ này, sau đó chúng tôi chọn bảng html bên cạnh thẻ được xác định. Đối với logic này, chúng tôi sẽ sử dụng find, anh chị em và find_next_siblings như được định nghĩa bên dưới.

 # Tìm tất cả phần tử h3 (f "{tutorialpoints_page.find_all ('h2')}") tags =tutorialpoints_page.find (lambda elm:elm.name =="h2" hoặc elm.name =="h3" hoặc elm.name =="h4" hoặc elm.name =="h5" hoặc elm.name =="h6") cho anh / chị / em trong tags.find_next_siblings ():nếu anh / chị / em gái.name =="bảng":my_table =anh / chị / em / người =pd.read_html (str (my_table)) print (tabulate (df [0], headers ='key', tablefmt ='psql')) 

Mã đầy đủ

7. Ghép tất cả lại với nhau ngay bây giờ.

 # BƯỚC1:Tải xuống trang bắt buộc nhập yêu cầu nhập gấu trúc dưới dạng pd # đặt trang web urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm"# Thực hiện yêu cầu tới serverresponse =request.get (site_url ) # Kiểm tra bản in phản hồi (f "*** Phản hồi cho {site_url} là {response.status_code}") # Kiểm tra tiêu đề yêu cầu (f "*** In tiêu đề yêu cầu - \ n {response.request.headers} ") # Kiểm tra tiêu đề phản hồi (f" *** In tiêu đề yêu cầu - \ n {response.headers} ") # kiểm tra nội dung của resultsprint (f" *** Truy cập 100 / {len (response) đầu tiên. text)} ký tự - \ n \ n {response.text [:100]} ") # Phân tích cú pháp các trang HTML từ nhập bs4 BeautifulSouptutorialpoints_page =BeautifulSoup (response.text, 'html.parser') print (f" *** Tiêu đề của trang là - {tutorialpoints_page.title} ") # Bạn có thể trích xuất tiêu đề trang dưới dạng chuỗi cũng như in (f" *** Tiêu đề của trang là - {tutorialpoints_page.title.string} ") # Tìm tất cả h3 phần tử # print (f "{hướng dẫn rialpoints_page.find_all ('h2')} ") tags =tutorialpoints_page.find (lambda elm:elm.name ==" h2 "hoặc elm.name ==" h3 "hoặc elm.name ==" h4 "hoặc elm.name =="h5" hoặc elm.name =="h6") cho anh / chị / em trong tags.find_next_siblings ():nếu anh / chị / em gái.name =="bảng":my_table =anh / chị / em / pd.read_html (str (my_table)) print (df ) 

Đầu ra

 *** Phản hồi cho https://www.tutorialspoint.com/python/python_basic_operators.htm là 200 *** In tiêu đề yêu cầu - {'User-Agent':'python-Request / 2.22.0' , 'Chấp nhận-Mã hóa':'gzip, deflate', 'Chấp nhận':'* / *', 'Kết nối':'giữ nguyên'} *** In tiêu đề yêu cầu - {'Mã hóa Nội dung':'gzip ',' Phạm vi chấp nhận ':' byte ',' Tuổi ':' 558841 ',' Kiểm soát bộ nhớ cache ':' max-age =2592000 ',' Loại nội dung ':' text / html; charset =UTF-8 ',' Ngày ':' Thứ Bảy, ngày 24 tháng 10 năm 2020 09:45:13 GMT ',' Hết hạn ':' Thứ Hai, ngày 23 tháng 11 năm 2020 09:45:13 GMT ',' Được sửa đổi lần cuối ':' Thứ bảy, ngày 17 tháng 10 năm 2020 22:31:13 GMT ',' Máy chủ ':' ECS (meb / A77C) ',' Nghiêm ngặt-Vận chuyển-Bảo mật ':' max-age =63072000; includeSubdomains ',' Vary ':' Accept-Encoding ',' X-Cache ':' HIT ',' X-Content-Type-Options ':' nosniff ',' X-Frame-Options ':' SAMEORIGIN ',' X-XSS-Bảo vệ ':' 1; mode =block ',' Content-Length ':' 8863 '} *** Truy cập 100/37624 ký tự đầu tiên -     Python - Cơ bản Toán tử - Tutorialspoint  *** Tiêu đề của trang là -  Python - Các toán tử cơ bản - Tutorialspoint  *** Tiêu đề của trang là - Python - Các toán tử cơ bản - Tutorialspoint [

Các loại toán tử

,

Toán tử số học Python

,

Toán tử so sánh Python

,

Toán tử gán trong Python

,

Toán tử Bitwise Python

,

Toán tử logic Python

,

Toán tử tư cách thành viên Python

,

Toán tử nhận dạng Python

,

Ưu tiên toán tử Python

] [Mô tả toán tử \ 0 + Phép cộng Thêm các giá trị ở hai bên của toán tử.1 - Phép trừ Trừ toán hạng bên phải từ bên trái op ... 2 * Phép nhân Nhân các giá trị ở hai bên của toán tử3 / Phép chia Chia toán hạng bên trái cho toán hạng bên phải 4% Mô đun chia toán hạng tay trái bởi operan tay phải ... 5 ** Exponent Thực hiện phép tính lũy thừa (lũy thừa) trên op ... 6 // Phân chia tầng - Phép chia các toán hạng wher ...

Ví dụ

 0 a + b =301 a - b =-102 a * b =2003 b / a =24 b% a =05 a ** b =10 thành lũy thừa 206 9 // 2 =4 và 9.0 // 2.0 =4.0, -11 // 3 =-4, -11 ....] [Mô tả toán tử \ 0 ==Nếu giá trị của hai toán hạng bằng nhau thì ... 1! =Nếu giá trị của hai toán hạng không bằng nhau bằng nhau thì ... 2 <> Nếu giá trị của hai toán hạng không bằng nhau thì ... 3> Nếu giá trị của toán hạng bên trái lớn hơn t ... 4  =Nếu giá trị của toán hạng bên trái lớn hơn o ... 6 <=Nếu giá trị của toán hạng bên trái nhỏ hơn hoặc e ... 

Ví dụ

 0 (a ==b) là không đúng. 1 (a! =b) là đúng. 2 (a <> b) là đúng. Điều này tương tự với! =Operator.3 (a> b) is not true.4 (a  =b) is not true.6 (a <=b) is true. ] [Mô tả toán tử \ 0 =Gán giá trị từ toán hạng bên phải cho lef ... 1 + =Thêm AND Nó thêm toán hạng bên phải vào toán hạng bên trái và ... 2 - =Trừ AND Nó trừ toán hạng bên phải khỏi toán hạng bên trái .. .3 * =Nhân AND Nó nhân toán hạng bên phải với toán hạng bên trái ... 4 / =Chia AND Nó chia toán hạng bên trái với toán hạng bên phải ... 5% =Mô-đun AND Nó cần mô-đun sử dụng hai toán hạng và gán ... 6 ** =Exponent AND Thực hiện phép tính lũy thừa (lũy thừa) trên op ... 7 // =Phân chia theo tầng Nó thực hiện phân chia tầng trên các toán tử và như ... 

Ví dụ

 0 c =a + b gán giá trị của a + b vào c1 c + =a tương đương với c =c + a2 c - =a tương đương với c =c - a3 c * =a tương đương với c =c * a4 c / =a tương đương với c =c / a5 c% =a tương đương với c =c% a6 c ** =a tương đương với c =c ** a7 c // =a tương đương với c =c // a] [Toán tử \ 0 &Binary AND1 | Binary OR2 ^ Binary XOR3 ~ Binary Ones Complement4 <> Binary Right ShiftDescription \ 0 Toán tử sao chép một chút vào kết quả nếu nó xuất hiện ... 1 Nó sao chép một chút nếu nó tồn tại trong một trong hai toán hạng.2 Nó sao chép bit nếu nó được đặt trong một toán hạng ... 3 Nó là một ngôi và có tác dụng 'lật' b ... 4 Giá trị toán hạng bên trái được di chuyển sang trái bởi n ... 5 Giá trị toán hạng bên trái được di chuyển sang phải bởi cái ... 

Ví dụ

 0 (a &b) (có nghĩa là 0000 1100) 1 (a | b) =61 (nghĩa là 0011 1101) 2 (a ^ b) =49 (nghĩa là 0011 0001) 3 (~ a) =-61 (nghĩa là 1100 0011 trong phần bù của 2 ... 4 a <<2 =240 (nghĩa là 1111 0000) 5 a>> 2 =15 (nghĩa là 0000 1111)] [Mô tả toán tử \ 0 và lôgic AND Nếu cả hai toán hạng đều đúng thì điều kiện b ... 1 hoặc Logic HOẶC Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0 thì c ... 2 không phải là logic NOT Được sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Ví dụ 0 (a và b) là true. 1 (a hoặc b ) là đúng. 2 Không (a và b) là sai.] [Mô tả toán tử \ 0 trong Đánh giá thành đúng nếu nó tìm thấy một biến trong th ... 1 không trong Đánh giá thành đúng nếu nó không tìm thấy biến ... 

Ví dụ

 0 x trong y, ở đây cho kết quả là 1 nếu x là membe ... 1 x không thuộc y, ở đây không cho kết quả là 1 nếu x là ...] [Toán tử Mô tả \ 0 là Đánh giá thành true nếu các biến trên một trong hai s ... 1 không được Đánh giá thành false nếu các biến trên một trong hai ... 

Ví dụ

 0 x là y, đây là kết quả bằng 1 nếu id (x) bằng i ... 1 x không phải là y, ở đây không cho kết quả bằng 1 nếu id (x) ...] [Sr.No. Toán tử &Mô tả0 1 ** Luỹ thừa (nâng lên thành lũy thừa) 1 2 ~ + - Phép cộng, cộng và trừ một bậc (phương thức ... 2 3 * /% // Nhân, chia, modulo và tầng ... 3 4 + - Phép cộng và phép trừ4 5>> <> =Các toán tử so sánh 8 9 <> ==! =Các toán tử bằng nhau9 10 =% =/ =// =- =+ =* =** =Các toán tử gán10 11 không phải là các toán tử nhận dạng11 12 không có trong]