Hướng dẫn what does beautifulsoup html parser do? - Trình phân tích cú pháp html beautifulsoup làm gì?

Giới thiệu

Quét web đang thu thập thông tin theo chương trình từ các trang web khác nhau. Mặc dù có nhiều thư viện và khung trong các ngôn ngữ khác nhau có thể trích xuất dữ liệu web, Python từ lâu đã là một lựa chọn phổ biến vì rất nhiều tùy chọn để quét web.

Bài viết này sẽ cung cấp cho bạn một khóa học về sự cố trên web trong Python với súp đẹp - một thư viện Python nổi tiếng để phân tích HTML và XML.

Xóa web đạo đức

Quét web có mặt khắp nơi và cung cấp cho chúng tôi dữ liệu như chúng tôi sẽ nhận được với API. Tuy nhiên, là những công dân tốt của Internet, trách nhiệm của chúng tôi là tôn trọng các chủ sở hữu trang web mà chúng tôi cào. Dưới đây là một số nguyên tắc mà một người cạo web nên tuân thủ:

  • Đừng yêu cầu nội dung bị loại bỏ là của riêng chúng tôi. Chủ sở hữu trang web đôi khi dành một lượng thời gian dài để tạo ra các bài báo, thu thập chi tiết về sản phẩm hoặc thu hoạch nội dung khác. Chúng ta phải tôn trọng lao động và độc đáo của họ.
  • Đừng cạo một trang web không muốn được cạo. Các trang web đôi khi đi kèm với một tệp
    from bs4 import BeautifulSoup
    
    with open("doc.html") as fp:
        soup = BeautifulSoup(fp, "html.parser")
    
    7 - ​​xác định các phần của trang web có thể được xóa. Nhiều trang web cũng có một điều khoản sử dụng có thể không cho phép cạo. Chúng ta phải tôn trọng các trang web không muốn được cạo.
  • Có API có sẵn không? Lộng lẫy, không cần chúng tôi viết một cái cào. API được tạo để cung cấp quyền truy cập vào dữ liệu theo cách được kiểm soát theo định nghĩa của chủ sở hữu dữ liệu. Chúng tôi thích sử dụng API nếu chúng có sẵn.
  • Thực hiện yêu cầu đến một trang web có thể gây ra một khoản phí cho hiệu suất của trang web. Một cái cào web thực hiện quá nhiều yêu cầu có thể bị suy nhược như một cuộc tấn công DDoS. Chúng tôi phải cạo có trách nhiệm để chúng tôi không gây ra bất kỳ sự gián đoạn nào đối với hoạt động thường xuyên của trang web.

Tổng quan về món súp đẹp

Nội dung HTML của các trang web có thể được phân tích cú pháp và cạo bằng súp đẹp. Trong phần sau, chúng tôi sẽ bao gồm các chức năng hữu ích cho việc xóa các trang web.

Điều làm cho súp đẹp trở nên hữu ích là vô số chức năng mà nó cung cấp để trích xuất dữ liệu từ HTML. Hình ảnh này dưới đây minh họa một số chức năng chúng ta có thể sử dụng:

Hãy thực hành và xem làm thế nào chúng ta có thể phân tích HTML với súp đẹp. Xem xét trang HTML sau được lưu vào tệp là

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8:

<html>
<head>
  <title>Head's titletitle>
head>

<body>
  <p class="title"><b>Body's titleb>p>
  <p class="story">line begins
    <a href="http://example.com/element1" class="element" id="link1">1a>
    <a href="http://example.com/element2" class="element" id="link2">2a>
    <a href="http://example.com/avatar1" class="avatar" id="link3">3a>
  <p> line endsp>
body>
html>

Các đoạn mã sau đây được kiểm tra trên

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
9. Bạn có thể cài đặt mô -đun
soup.head.title   # returns Head's title
0 bằng cách nhập lệnh sau vào thiết bị đầu cuối:

$ pip3 install beautifulsoup4

Tệp HTML

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8 cần được chuẩn bị. Điều này được thực hiện bằng cách chuyển tệp cho hàm tạo
soup.head.title   # returns Head's title
0, chúng ta hãy sử dụng Shell Python tương tác cho việc này, vì vậy chúng ta có thể in ngay nội dung của một phần cụ thể của một trang:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")

Bây giờ chúng tôi có thể sử dụng súp đẹp để điều hướng trang web của chúng tôi và trích xuất dữ liệu.

Điều hướng đến các thẻ cụ thể

Từ đối tượng súp được tạo trong phần trước, hãy lấy thẻ tiêu đề của

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8:

soup.head.title   # returns Head's title

Đây là sự cố của từng thành phần chúng tôi đã sử dụng để có được tiêu đề:

Súp đẹp rất mạnh mẽ vì các đối tượng Python của chúng ta phù hợp với cấu trúc lồng nhau của tài liệu HTML mà chúng ta đang cạo.

Để nhận văn bản của thẻ

soup.head.title   # returns Head's title
4 đầu tiên, hãy nhập cái này:

soup.body.a.text  # returns '1'

Để có được tiêu đề trong thẻ cơ thể của HTML (được biểu thị bằng lớp "Tiêu đề"), hãy nhập các loại sau trong thiết bị đầu cuối của bạn:

soup.body.p.b     # returns Body's title

Đối với các tài liệu HTML được lồng sâu, điều hướng có thể nhanh chóng trở nên tẻ nhạt. May mắn thay, súp đẹp đi kèm với chức năng tìm kiếm vì vậy chúng tôi không phải điều hướng để lấy các yếu tố HTML.

Tìm kiếm các yếu tố của thẻ

Phương thức

soup.head.title   # returns Head's title
5 lấy thẻ HTML làm đối số chuỗi và trả về danh sách các phần tử khớp với thẻ được cung cấp. Ví dụ: nếu chúng ta muốn tất cả các thẻ
soup.head.title   # returns Head's title
6 trong
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8:

soup.find_all("a")

Chúng ta sẽ thấy danh sách các thẻ

soup.head.title   # returns Head's title
6 này làm đầu ra:

[1, 2, 3]

Dưới đây là sự cố của từng thành phần chúng tôi sử dụng để tìm kiếm thẻ:

Chúng tôi có thể tìm kiếm các thẻ của một lớp cụ thể bằng cách cung cấp đối số

soup.head.title   # returns Head's title
9. Súp đẹp sử dụng
soup.head.title   # returns Head's title
9 vì
soup.body.a.text  # returns '1'
1 là một từ khóa dành riêng trong Python. Hãy tìm kiếm tất cả các thẻ
soup.head.title   # returns Head's title
6 có lớp "phần tử":

soup.find_all("a", class_="element")

Vì chúng tôi chỉ có hai liên kết với lớp "Phần tử", bạn sẽ thấy đầu ra này:

[1, 2]

Điều gì sẽ xảy ra nếu chúng ta muốn tìm nạp các liên kết được nhúng bên trong các thẻ

soup.head.title   # returns Head's title
6? Chúng ta hãy truy xuất thuộc tính
soup.body.a.text  # returns '1'
4 của liên kết bằng tùy chọn
soup.body.a.text  # returns '1'
5. Nó hoạt động giống như
soup.head.title   # returns Head's title
5 nhưng nó trả về phần tử phù hợp đầu tiên thay vì danh sách. Nhập cái này vào vỏ của bạn:

$ pip3 install beautifulsoup4
0

Các hàm

soup.body.a.text  # returns '1'
5 và
soup.head.title   # returns Head's title
5 cũng chấp nhận biểu thức chính quy thay vì chuỗi. Đằng sau hậu trường, văn bản sẽ được lọc bằng phương pháp
soup.body.a.text  # returns '1'
9 biểu thức được biên dịch. Ví dụ:

$ pip3 install beautifulsoup4
1

Danh sách khi lặp lại, tìm nạp các thẻ bắt đầu bằng ký tự

soup.body.p.b     # returns Body's title
0 bao gồm
soup.body.p.b     # returns Body's title
1 và
soup.body.p.b     # returns Body's title
2:

Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!

$ pip3 install beautifulsoup4
2

Chúng tôi đã đề cập đến các cách phổ biến nhất để nhận thẻ và thuộc tính của chúng. Đôi khi, đặc biệt là đối với các trang web ít năng động hơn, chúng tôi chỉ muốn văn bản từ nó. Hãy xem làm thế nào chúng ta có thể có được nó!

Nhận toàn bộ văn bản

Hàm

soup.body.p.b     # returns Body's title
3 lấy tất cả các văn bản từ tài liệu HTML. Hãy lấy tất cả văn bản của tài liệu HTML:

$ pip3 install beautifulsoup4
3

Đầu ra của bạn sẽ như thế này:

$ pip3 install beautifulsoup4
4

Đôi khi các ký tự mới được in, vì vậy đầu ra của bạn cũng có thể trông giống như thế này:

$ pip3 install beautifulsoup4
5

Bây giờ chúng ta có cảm giác về cách sử dụng súp đẹp, hãy cạo một trang web!

Súp đẹp trong hành động - Quét danh sách sách

Bây giờ chúng tôi đã thành thạo các thành phần của súp đẹp, đã đến lúc phải học cách sử dụng. Hãy xây dựng một cạp để trích xuất dữ liệu từ https://books.toscrape.com/ và lưu nó vào tệp CSV. Trang web chứa dữ liệu ngẫu nhiên về sách và là một không gian tuyệt vời để kiểm tra các kỹ thuật quét web của bạn.

Đầu tiên, tạo một tệp mới có tên

soup.body.p.b     # returns Body's title
4. Hãy nhập tất cả các thư viện mà chúng tôi cần cho tập lệnh này:

$ pip3 install beautifulsoup4
6

Trong các mô -đun được đề cập ở trên:

  • soup.body.p.b     # returns Body's title
    
    5 - Thực hiện yêu cầu URL và tìm kiếm HTML của trang web
  • soup.body.p.b     # returns Body's title
    
    6 - Giới hạn số lần chúng tôi cạo trên trang cùng một lúc
  • soup.body.p.b     # returns Body's title
    
    7 - Giúp chúng tôi xuất dữ liệu được quét vào tệp CSV
  • soup.body.p.b     # returns Body's title
    
    8 - Cho phép chúng tôi viết các biểu thức chính quy sẽ có ích để chọn văn bản dựa trên mẫu của nó
  • soup.body.p.b     # returns Body's title
    
    9 - của bạn thực sự, mô -đun cạo để phân tích HTML

Bạn sẽ có

soup.body.p.b     # returns Body's title
9 đã được cài đặt và
soup.body.p.b     # returns Body's title
6,
soup.body.p.b     # returns Body's title
7 và
soup.body.p.b     # returns Body's title
8 là các gói tích hợp trong Python. Bạn sẽ cần cài đặt mô -đun
soup.body.p.b     # returns Body's title
5 trực tiếp như thế này:

$ pip3 install beautifulsoup4
7

Trước khi bạn bắt đầu, bạn cần hiểu cách cấu trúc HTML của trang web. Trong trình duyệt của bạn, chúng ta hãy truy cập http://books.toscrape.com/catalogue/page-1.html. Sau đó, nhấp chuột phải vào các thành phần của trang web sẽ được cạo và nhấp vào nút Kiểm tra để hiểu hệ thống phân cấp của các thẻ như được hiển thị bên dưới.inspect button to understand the hierarchy of the tags as shown below.

Điều này sẽ cho bạn thấy HTML cơ bản cho những gì bạn đang kiểm tra. Hình ảnh sau đây minh họa các bước sau:

Từ việc kiểm tra HTML, chúng tôi tìm hiểu cách truy cập URL của cuốn sách, hình ảnh bìa, tiêu đề, xếp hạng, giá cả và nhiều trường hơn từ HTML. Hãy viết một chức năng loại bỏ một mục sách và trích xuất dữ liệu của nó:

$ pip3 install beautifulsoup4
8

Dòng cuối cùng của đoạn trích trên chỉ vào một hàm để viết danh sách các chuỗi được quét vào tệp CSV. Hãy thêm chức năng đó ngay bây giờ:

$ pip3 install beautifulsoup4
9

Vì chúng tôi có một chức năng có thể cạo một trang và xuất sang CSV, chúng tôi muốn một chức năng khác thu thập thông qua trang web được phân trang, thu thập dữ liệu sách trên mỗi trang.

Để làm điều này, chúng ta hãy nhìn vào URL mà chúng ta đang viết cái cào này cho:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
0

Phần tử khác nhau duy nhất trong URL là số trang. Chúng ta có thể định dạng URL động để nó trở thành URL hạt giống:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
1

Chuỗi này được định dạng URL với số trang có thể được tìm nạp bằng phương thức

soup.find_all("a")
5. Sau đó chúng ta có thể tạo một đối tượng
soup.head.title   # returns Head's title
0 mới. Mỗi lần chúng tôi nhận được đối tượng súp, sự hiện diện của nút "tiếp theo" được kiểm tra để chúng tôi có thể dừng ở trang cuối. Chúng tôi theo dõi một bộ đếm cho số trang được tăng thêm 1 sau khi cạo thành công một trang.

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
2

Hàm ở trên,

soup.find_all("a")
7, được gọi đệ quy cho đến khi hàm
soup.find_all("a")
8 trả về
soup.find_all("a")
9. Tại thời điểm này, mã sẽ xóa phần còn lại của trang web và lối ra.

Đối với phần cuối cùng của câu đố, chúng tôi bắt đầu dòng chảy. Chúng tôi xác định

[1, 2, 3]
0 và gọi
soup.find_all("a")
7 để lấy dữ liệu. Điều này được thực hiện trong khối
[1, 2, 3]
2:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
3

Nếu bạn muốn tìm hiểu thêm về khối

[1, 2, 3]
2, hãy xem hướng dẫn của chúng tôi về cách thức hoạt động.

Bạn có thể thực thi tập lệnh như được hiển thị bên dưới trong thiết bị đầu cuối của mình và nhận đầu ra là:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
4
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
5

Dữ liệu đã được tìm thấy trong thư mục làm việc hiện tại theo tên tệp

[1, 2, 3]
4. Đây là mẫu nội dung của tệp:

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
6

Làm tốt lắm! Nếu bạn muốn có một cái nhìn toàn bộ mã Scraper, bạn có thể tìm thấy nó trên GitHub.

Sự kết luận

Trong hướng dẫn này, chúng tôi đã học được đạo đức của việc viết những người phế liệu web tốt. Sau đó, chúng tôi đã sử dụng súp đẹp để trích xuất dữ liệu từ tệp HTML bằng các thuộc tính đối tượng của súp đẹp và đó là các phương pháp khác nhau như

soup.body.a.text  # returns '1'
5,
soup.head.title   # returns Head's title
5 và
soup.body.p.b     # returns Body's title
3. Sau đó, chúng tôi đã xây dựng một cạp hơn là lấy một danh sách sách trực tuyến và xuất sang CSV.

Quét web là một kỹ năng hữu ích giúp các hoạt động khác nhau như trích xuất dữ liệu như API, thực hiện QA trên trang web, kiểm tra các URL bị hỏng trên trang web và hơn thế nữa. Cẩu tiếp theo bạn sẽ xây dựng là gì?

Việc sử dụng trình phân tích cú pháp HTML là gì?

Phân tích cú pháp HTML liên quan đến việc xây dựng mã thông báo và xây dựng cây. Mã thông báo HTML bao gồm các thẻ bắt đầu và kết thúc, cũng như tên và giá trị thuộc tính. Nếu tài liệu được hình thành tốt, phân tích cú pháp thì đơn giản và nhanh hơn. Trình phân tích cú pháp phân tích cú pháp đầu vào vào tài liệu, xây dựng cây tài liệu.parses tokenized input into the document, building up the document tree.

Làm thế nào để bạn phân tích phản hồi HTML trong Python?

Example..
từ HTML.Nhập phân tích cú pháp Htmlparser ..
Trình phân tích cú pháp lớp (HTMLPARSER):.
# Phương thức để nối thẻ bắt đầu vào danh sách start_tags ..
DEF Tay cầm_starttag (self, Tag, attrs):.
Global start_tags ..
start_tags.Phụ lục (thẻ).
# Phương thức nối thẻ kết thúc vào danh sách end_tags ..
DEF Tay cầm_endtag (self, tag):.

Làm thế nào để người ta phân tích HTML vào một đối tượng đẹp được đưa ra một đối tượng phản hồi?

Approach:..
Nhập mô -đun ..
Tạo tài liệu HTML và chỉ định thẻ '' vào mã ..
Chuyển tài liệu HTML vào hàm đẹp () ..
Sử dụng thẻ 'P' để trích xuất các đoạn văn từ đối tượng đẹp ..
Nhận văn bản từ tài liệu HTML bằng get_text () ..

Làm cách nào để đọc các tệp HTML trong BeautifulSoup?

Python: phân tích tệp HTML bằng cách sử dụng đẹp..
từ BS4 Nhập đẹp đẹp với Mở ('File/File1.html') dưới dạng F: #Read File Nội dung = f.Đọc () #parse html súp = đẹp (nội dung, 'html.parser') #print tiêu đề thẻ in (súp. ....
f = open ('file.html') nội dung = f.....
Nhập tệp glob = glob ..