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>
แกะ () เหมาะสำหรับการลอกมาร์กอัปออก