Beautiful Soup - Sửa cây

Một trong những khía cạnh quan trọng của BeautifulSoup là tìm kiếm cây phân tích cú pháp và nó cho phép bạn thực hiện các thay đổi đối với tài liệu web theo yêu cầu của bạn. Chúng tôi có thể thực hiện các thay đổi đối với các thuộc tính của thẻ bằng cách sử dụng các thuộc tính của nó, chẳng hạn như phương thức .name, .string hoặc .append (). Nó cho phép bạn thêm các thẻ và chuỗi mới vào thẻ hiện có với sự trợ giúp của các phương thức .new_string () và .new_tag (). Cũng có những phương thức khác, chẳng hạn như .insert (), .insert_before () hoặc .insert_osystem () để thực hiện các sửa đổi khác nhau đối với tài liệu HTML hoặc XML của bạn.

Thay đổi tên thẻ và thuộc tính

Khi bạn đã tạo súp, bạn có thể dễ dàng thực hiện sửa đổi như đổi tên thẻ, sửa đổi các thuộc tính của thẻ, thêm thuộc tính mới và xóa thuộc tính.

>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>')
>>> tag = soup.b

Sửa đổi và thêm các thuộc tính mới như sau:

>>> tag.name = 'Blockquote'
>>> tag['class'] = 'Bolder'
>>> tag['id'] = 1.1
>>> tag
<Blockquote class="Bolder" id="1.1">Very Bold</Blockquote>

Việc xóa các thuộc tính như sau:

>>> del tag['class']
>>> tag
<Blockquote id="1.1">Very Bold</Blockquote>
>>> del tag['id']
>>> tag
<Blockquote>Very Bold</Blockquote>

Đang sửa đổi .string

Bạn có thể dễ dàng sửa đổi thuộc tính .string của thẻ -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner>/i<</a>'
>>> Bsoup = BeautifulSoup(markup)
>>> tag = Bsoup.a
>>> tag.string = "My Favourite spot."
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">My Favourite spot.</a>

Từ phía trên, chúng ta có thể thấy nếu thẻ chứa bất kỳ thẻ nào khác, chúng và tất cả nội dung của chúng sẽ được thay thế bằng dữ liệu mới.

append ()

Thêm dữ liệu / nội dung mới vào thẻ hiện có bằng cách sử dụng phương thức tag.append (). Nó rất giống với phương thức append () trong danh sách Python.

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i></a>'
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.a.append(" Really Liked it")
>>> Bsoup
<html><body><a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i> Really Liked it</a></body></html>
>>> Bsoup.a.contents
['Must for every ', <i>Learner</i>, ' Really Liked it']

NavigableString () và .new_tag ()

Trong trường hợp bạn muốn thêm một chuỗi vào tài liệu, điều này có thể được thực hiện dễ dàng bằng cách sử dụng append () hoặc bằng hàm tạo NavigableString () -

>>> soup = BeautifulSoup("<b></b>")
>>> tag = soup.b
>>> tag.append("Start")
>>>
>>> new_string = NavigableString(" Your")
>>> tag.append(new_string)
>>> tag
<b>Start Your</b>
>>> tag.contents
['Start', ' Your']

Note: Nếu bạn tìm thấy bất kỳ tên nào Lỗi khi truy cập hàm NavigableString (), như sau−

NameError: tên 'NavigableString' không được xác định

Chỉ cần nhập thư mục NavigableString từ gói bs4 -

>>> from bs4 import NavigableString

Chúng tôi có thể giải quyết lỗi trên.

Bạn có thể thêm nhận xét vào thẻ hiện tại của mình hoặc có thể thêm một số lớp con khác của NavigableString, chỉ cần gọi hàm tạo.

>>> from bs4 import Comment
>>> adding_comment = Comment("Always Learn something Good!")
>>> tag.append(adding_comment)
>>> tag
<b>Start Your<!--Always Learn something Good!--></b>
>>> tag.contents
['Start', ' Your', 'Always Learn something Good!']

Thêm một thẻ hoàn toàn mới (không nối vào thẻ hiện có) có thể được thực hiện bằng cách sử dụng phương pháp có sẵn Beautifulsoup, BeautifulSoup.new_tag () -

>>> soup = BeautifulSoup("<b></b>")
>>> Otag = soup.b
>>>
>>> Newtag = soup.new_tag("a", href="https://www.tutorialspoint.com")
>>> Otag.append(Newtag)
>>> Otag
<b><a href="https://www.tutorialspoint.com"></a></b>

Chỉ đối số đầu tiên, tên thẻ, là bắt buộc.

chèn()

Tương tự như phương thức .insert () trên danh sách python, tag.insert () sẽ chèn phần tử mới, tuy nhiên, không giống như tag.append (), phần tử mới không nhất thiết phải đi vào cuối nội dung gốc của nó. Phần tử mới có thể được thêm vào bất kỳ vị trí nào.

>>> markup = '<a href="https://www.djangoproject.com/community/">Django Official website <i>Huge Community base</i></a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>>
>>> tag.insert(1, "Love this framework ")
>>> tag
<a href="https://www.djangoproject.com/community/">Django Official website Love this framework <i>Huge Community base</i></a>
>>> tag.contents
['Django Official website ', 'Love this framework ', <i>Huge Community base</i
>]
>>>

insert_before () và insert_ after ()

Để chèn một số thẻ hoặc chuỗi ngay trước một cái gì đó trong cây phân tích cú pháp, chúng tôi sử dụng insert_before () -

>>> soup = BeautifulSoup("Brave")
>>> tag = soup.new_tag("i")
>>> tag.string = "Be"
>>>
>>> soup.b.string.insert_before(tag)
>>> soup.b
<b><i>Be</i>Brave</b>

Tương tự như vậy để chèn một số thẻ hoặc chuỗi ngay sau một cái gì đó trong cây phân tích cú pháp, hãy sử dụng insert_ after ().

>>> soup.b.i.insert_after(soup.new_string(" Always "))
>>> soup.b
<b><i>Be</i> Always Brave</b>
>>> soup.b.contents
[<i>Be</i>, ' Always ', 'Brave']

thông thoáng()

Để xóa nội dung của thẻ, hãy sử dụng tag.clear () -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical&lr;/i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> tag.clear()
>>> tag
<a href="https://www.tutorialspoint.com/index.htm"></a>

trích xuất()

Để xóa thẻ hoặc các chuỗi khỏi cây, hãy sử dụng PageElement.extract ().

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i&gr;technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> i_tag = soup.i.extract()
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>
>>> i_tag
<i>technical & Non-technical</i>
>>>
>>> print(i_tag.parent)
None

phân hủy ()

Thẻ.decompose () xóa một thẻ khỏi cây và xóa tất cả nội dung của nó.

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> soup.i.decompose()
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>

Thay thế bằng()

Như tên cho thấy, hàm pageElement.replace_with () sẽ thay thế thẻ hoặc chuỗi cũ bằng thẻ hoặc chuỗi mới trong cây -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Complete Python <i>Material</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> new_tag = soup.new_tag("Official_site")
>>> new_tag.string = "https://www.python.org/"
>>> a_tag.i.replace_with(new_tag)
<i>Material</i>
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">Complete Python <Official_site>https://www.python.org/</Official_site></a>

Trong kết quả đầu ra ở trên, bạn đã nhận thấy rằng Replace_with () trả về thẻ hoặc chuỗi đã được thay thế (như "Material" trong trường hợp của chúng tôi), vì vậy bạn có thể kiểm tra hoặc thêm lại nó vào một phần khác của cây.

bọc ()

TrangElement.wrap () đã bao gồm một phần tử trong thẻ bạn chỉ định và trả về một trình bao bọc mới -

>>> soup = BeautifulSoup("<p>tutorialspoint.com</p>")
>>> soup.p.string.wrap(soup.new_tag("b"))
<b>tutorialspoint.com</b>
>>>
>>> soup.p.wrap(soup.new_tag("Div"))
<Div><p><b>tutorialspoint.com</b></p></Div>

mở ()

Thẻ.unwrap () đối lập với wrap () và thay thế một thẻ bằng bất cứ thứ gì bên trong thẻ đó.

>>> soup = BeautifulSoup('<a href="https://www.tutorialspoint.com/">I liked <i>tutorialspoint</i></a>')
>>> a_tag = soup.a
>>>
>>> a_tag.i.unwrap()
<i></i>
>>> a_tag
<a href="https://www.tutorialspoint.com/">I liked tutorialspoint</a>

Từ trên, bạn đã nhận thấy rằng giống như Replace_with (), Unrap () trả về thẻ đã được thay thế.

Dưới đây là một ví dụ khác về unsrap () để hiểu rõ hơn:

>>> soup = BeautifulSoup("<p>I <strong>AM</strong> a <i>text</i>.</p>")
>>> soup.i.unwrap()
<i></i>
>>> soup
<html><body><p>I <strong>AM</strong> a text.</p></body></html>

Unrap () rất tốt để loại bỏ đánh dấu.