Beautiful Soup - ดัดแปลงต้นไม้

สิ่งสำคัญอย่างหนึ่งของ BeautifulSoup คือการค้นหาโครงสร้างการแยกวิเคราะห์และช่วยให้คุณสามารถเปลี่ยนแปลงเอกสารเว็บได้ตามความต้องการของคุณ เราสามารถเปลี่ยนแปลงคุณสมบัติของแท็กโดยใช้แอตทริบิวต์เช่น. name, .string หรือ. append () วิธีการ ช่วยให้คุณสามารถเพิ่มแท็กและสตริงใหม่ให้กับแท็กที่มีอยู่โดยใช้วิธีการ. new_string () และ. new_tag () ยังมีวิธีการอื่น ๆ เช่น. insert (), .insert_before () หรือ. insert_after () เพื่อทำการแก้ไขต่างๆในเอกสาร HTML หรือ XML ของคุณ

การเปลี่ยนชื่อแท็กและแอตทริบิวต์

เมื่อคุณสร้างซุปแล้วคุณสามารถแก้ไขได้ง่ายเช่นเปลี่ยนชื่อแท็กแก้ไขแอตทริบิวต์เพิ่มแอตทริบิวต์ใหม่และลบแอตทริบิวต์

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

การปรับเปลี่ยนและเพิ่มแอตทริบิวต์ใหม่มีดังนี้ -

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

การลบแอตทริบิวต์มีดังนี้ -

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

การแก้ไข. string

คุณสามารถแก้ไขแอตทริบิวต์. string ของแท็กได้อย่างง่ายดาย -

>>> 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>

จากด้านบนเราสามารถดูว่าแท็กมีแท็กอื่นหรือไม่แท็กและเนื้อหาทั้งหมดจะถูกแทนที่ด้วยข้อมูลใหม่

ผนวก()

การเพิ่มข้อมูล / เนื้อหาใหม่ให้กับแท็กที่มีอยู่ทำได้โดยใช้เมธอด tag.append () มันคล้ายกับ append () method ในรายการ 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 () และ. new_tag ()

ในกรณีที่คุณต้องการเพิ่มสตริงในเอกสารสามารถทำได้อย่างง่ายดายโดยใช้ append () หรือโดยตัวสร้าง 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: หากคุณพบชื่อข้อผิดพลาดขณะเข้าถึงฟังก์ชัน NavigableString () ดังต่อไปนี้

NameError: ไม่ได้กำหนดชื่อ 'NavigableString'

เพียงแค่นำเข้าไดเร็กทอรี NavigableString จากแพ็คเกจ bs4 -

>>> from bs4 import NavigableString

เราสามารถแก้ไขข้อผิดพลาดข้างต้นได้

คุณสามารถเพิ่มความคิดเห็นลงในแท็กที่มีอยู่ของคุณหรือสามารถเพิ่มคลาสย่อยอื่น ๆ ของ NavigableString ได้เพียงแค่เรียกตัวสร้าง

>>> 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!']

การเพิ่มแท็กใหม่ทั้งหมด (ไม่ต่อท้ายแท็กที่มีอยู่) สามารถทำได้โดยใช้เมธอด Beautifulsoup inbuilt, 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>

ต้องระบุเฉพาะอาร์กิวเมนต์แรกชื่อแท็ก

แทรก()

เช่นเดียวกับ. insert () วิธีการในรายการ python tag.insert () จะแทรกองค์ประกอบใหม่อย่างไรก็ตามไม่เหมือนกับ tag.append () องค์ประกอบใหม่ไม่จำเป็นต้องอยู่ที่ส่วนท้ายของเนื้อหาของพาเรนต์ สามารถเพิ่มองค์ประกอบใหม่ได้ทุกตำแหน่ง

>>> 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 () และ insert_after ()

ในการแทรกแท็กหรือสตริงก่อนบางสิ่งในโครงสร้างการแยกวิเคราะห์เราใช้ 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>

ในทำนองเดียวกันหากต้องการแทรกแท็กหรือสตริงหลังบางสิ่งในโครงสร้างแยกวิเคราะห์ให้ใช้ 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']

ชัดเจน()

ในการลบเนื้อหาของแท็กให้ใช้ 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>

สารสกัด ()

ในการลบแท็กหรือสตริงออกจากโครงสร้างให้ใช้ 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

ย่อยสลาย ()

tag.decompose () ลบแท็กออกจากทรีและลบเนื้อหาทั้งหมด

>>> 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>
>>>

แทนที่ด้วย ()

ตามชื่อที่แนะนำฟังก์ชัน pageElement.replace_with () จะแทนที่แท็กหรือสตริงเก่าด้วยแท็กหรือสตริงใหม่ในแผนภูมิ -

>>> 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>

ในผลลัพธ์ด้านบนคุณสังเกตเห็นว่า replace_with () ส่งคืนแท็กหรือสตริงที่ถูกแทนที่ (เช่น "วัสดุ" ในกรณีของเรา) ดังนั้นคุณสามารถตรวจสอบหรือเพิ่มกลับไปที่ส่วนอื่นของต้นไม้ได้

ห่อ ()

pageElement.wrap () ล้อมรอบองค์ประกอบในแท็กที่คุณระบุและส่งคืน Wrapper ใหม่ -

>>> 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>

แกะ()

tag.unwrap () อยู่ตรงข้ามกับ wrap () และแทนที่แท็กด้วยอะไรก็ตามที่อยู่ในแท็กนั้น

>>> 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>

จากด้านบนคุณสังเกตเห็นว่าเช่น replace_with () การแกะ () จะส่งกลับแท็กที่ถูกแทนที่

ด้านล่างนี้เป็นอีกหนึ่งตัวอย่างของการแกะ () เพื่อให้เข้าใจได้ดีขึ้น -

>>> 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>

แกะ () เหมาะสำหรับการลอกมาร์กอัปออก