Beautiful Soup - Các loại đồ vật
Khi chúng tôi chuyển một tài liệu hoặc chuỗi html sang một phương thức khởi tạo beautifulsoup, về cơ bản, beautifulsoup sẽ chuyển đổi một trang html phức tạp thành các đối tượng python khác nhau. Dưới đây chúng ta sẽ thảo luận về bốn loại đối tượng chính:
Tag
NavigableString
BeautifulSoup
Comments
Đối tượng thẻ
Thẻ HTML được sử dụng để xác định nhiều loại nội dung khác nhau. Một đối tượng thẻ trong BeautifulSoup tương ứng với một thẻ HTML hoặc XML trong trang hoặc tài liệu thực tế.
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<b class="boldest">TutorialsPoint</b>')
>>> tag = soup.html
>>> type(tag)
<class 'bs4.element.Tag'>
Thẻ chứa rất nhiều thuộc tính và phương thức và hai tính năng quan trọng của thẻ là tên và thuộc tính của nó.
Tên (tag.name)
Mỗi thẻ chứa một tên và có thể được truy cập thông qua '.name' làm hậu tố. tag.name sẽ trả về loại thẻ.
>>> tag.name
'html'
Tuy nhiên, nếu chúng tôi thay đổi tên thẻ, điều tương tự sẽ được phản ánh trong đánh dấu HTML do BeautifulSoup tạo ra.
>>> tag.name = "Strong"
>>> tag
<Strong><body><b class="boldest">TutorialsPoint</b></body></Strong>
>>> tag.name
'Strong'
Các thuộc tính (tag.attrs)
Một đối tượng thẻ có thể có bất kỳ số lượng thuộc tính nào. Thẻ <b class = "boldest"> có thuộc tính "class" có giá trị là "boldest". Bất kỳ thứ gì không phải là thẻ NOT, về cơ bản là một thuộc tính và phải chứa một giá trị. Bạn có thể truy cập các thuộc tính thông qua truy cập các khóa (như truy cập “lớp” trong ví dụ trên) hoặc truy cập trực tiếp thông qua “.attrs”
>>> tutorialsP = BeautifulSoup("<div class='tutorialsP'></div>",'lxml')
>>> tag2 = tutorialsP.div
>>> tag2['class']
['tutorialsP']
Chúng tôi có thể thực hiện tất cả các loại sửa đổi đối với các thuộc tính của thẻ (thêm / xóa / sửa đổi).
>>> tag2['class'] = 'Online-Learning'
>>> tag2['style'] = '2007'
>>>
>>> tag2
<div class="Online-Learning" style="2007"></div>
>>> del tag2['style']
>>> tag2
<div class="Online-Learning"></div>
>>> del tag['class']
>>> tag
<b SecondAttribute="2">TutorialsPoint</b>
>>>
>>> del tag['SecondAttribute']
>>> tag
</b>
>>> tag2['class']
'Online-Learning'
>>> tag2['style']
KeyError: 'style'
Thuộc tính đa giá trị
Một số thuộc tính HTML5 có thể có nhiều giá trị. Thường được sử dụng nhất là thuộc tính lớp có thể có nhiều giá trị CSS. Những thứ khác bao gồm 'rel', 'rev', 'headers', 'accesskey' và 'accept-charset'. Các thuộc tính đa giá trị trong món súp đẹp được hiển thị dưới dạng danh sách.
>>> from bs4 import BeautifulSoup
>>>
>>> css_soup = BeautifulSoup('<p class="body"></p>')
>>> css_soup.p['class']
['body']
>>>
>>> css_soup = BeautifulSoup('<p class="body bold"></p>')
>>> css_soup.p['class']
['body', 'bold']
Tuy nhiên, nếu bất kỳ thuộc tính nào chứa nhiều hơn một giá trị nhưng nó không phải là thuộc tính đa giá trị theo bất kỳ phiên bản nào của tiêu chuẩn HTML, thì canh đẹp sẽ để nguyên thuộc tính này -
>>> id_soup = BeautifulSoup('<p id="body bold"></p>')
>>> id_soup.p['id']
'body bold'
>>> type(id_soup.p['id'])
<class 'str'>
Bạn có thể hợp nhất nhiều giá trị thuộc tính nếu bạn chuyển thẻ thành một chuỗi.
>>> rel_soup = BeautifulSoup("<p> tutorialspoint Main <a rel='Index'> Page</a></p>")
>>> rel_soup.a['rel']
['Index']
>>> rel_soup.a['rel'] = ['Index', ' Online Library, Its all Free']
>>> print(rel_soup.p)
<p> tutorialspoint Main <a rel="Index Online Library, Its all Free"> Page</a></p>
Bằng cách sử dụng 'get_attribute_list', bạn nhận được một giá trị luôn là một danh sách, chuỗi, bất kể nó có phải là nhiều giá trị hay không.
id_soup.p.get_attribute_list(‘id’)
Tuy nhiên, nếu bạn phân tích cú pháp tài liệu dưới dạng 'xml', không có thuộc tính đa giá trị nào -
>>> xml_soup = BeautifulSoup('<p class="body bold"></p>', 'xml')
>>> xml_soup.p['class']
'body bold'
NavigableString
Đối tượng điều hướng được sử dụng để đại diện cho nội dung của thẻ. Để truy cập nội dung, hãy sử dụng thẻ “.string”.
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>>
>>> soup.string
'Hello, Tutorialspoint!'
>>> type(soup.string)
>
Bạn có thể thay thế chuỗi bằng một chuỗi khác nhưng bạn không thể chỉnh sửa chuỗi hiện có.
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> soup.string.replace_with("Online Learning!")
'Hello, Tutorialspoint!'
>>> soup.string
'Online Learning!'
>>> soup
<html><body><h2 id="message">Online Learning!</h2></body></html>
BeautifulSoup
BeautifulSoup là đối tượng được tạo khi chúng ta cố gắng thu thập tài nguyên web. Vì vậy, nó là tài liệu hoàn chỉnh mà chúng tôi đang cố gắng thu thập. Hầu hết thời gian, nó là đối tượng thẻ được xử lý.
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>> soup.name
'[document]'
Bình luận
Đối tượng bình luận minh họa phần bình luận của tài liệu web. Nó chỉ là một loại NavigableString đặc biệt.
>>> soup = BeautifulSoup('<p><!-- Everything inside it is COMMENTS --></p>')
>>> comment = soup.p.string
>>> type(comment)
<class 'bs4.element.Comment'>
>>> type(comment)
<class 'bs4.element.Comment'>
>>> print(soup.p.prettify())
<p>
<!-- Everything inside it is COMMENTS -->
</p>
Đối tượng NavigableString
Các đối tượng điều hướng được sử dụng để biểu thị văn bản trong các thẻ, thay vì chính các thẻ.