آموزش اصلاح درخت در Beautiful Soup
آموزش اصلاح درخت در Beautiful Soup
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش اصلاح درخت در Beautiful Soup خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون
یکی از جنبه های مهم BeautifulSoup جستجو در درخت تجزیه است و به شما امکان می دهد متناسب با نیاز خود در سند وب تغییراتی ایجاد کنید. ما می توانیم خصوصیات تگ را با استفاده از ویژگی های آن مانندمتد .name ، .string یا .append تغییر دهیم. به شما امکان می دهد با کمک متد های ()new_string. و ()new_tag. برچسب ها و رشته های جدیدی را به تگ موجود اضافه کنید. روشهای دیگری نیز وجود دارد، مانند ()insert () ، .insert_before. یا()insert_after. برای ایجاد تغییرات مختلف در سند HTML یا XML.
تغییر نام و مشخصات تگ ها
هنگامی که soup را ایجاد کردید، ایجاد تغییر مانند تغییر نام تگ، ایجاد تغییر در ویژگی های آن، افزودن ویژگی های جدید و حذف ویژگی ها آسان است.
1 2 |
>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>') >>> tag = soup.b |
اصلاح و افزودن ویژگی های جدید به شرح زیر است –
1 2 3 4 5 |
>>> tag.name = 'Blockquote' >>> tag['class'] = 'Bolder' >>> tag['id'] = 1.1 >>> tag <Blockquote class="Bolder" id="1.1">Very Bold</Blockquote> |
ویژگی ها به شرح زیر است –
1 2 3 4 5 6 |
>>> del tag['class'] >>> tag <Blockquote id="1.1">Very Bold</Blockquote> >>> del tag['id'] >>> tag <Blockquote>Very Bold</Blockquote> |
اصلاح رشته
به راحتی می توانید ویژگی تگ string. را اصلاح کنید –
1 2 3 4 5 6 |
>>> 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> |
از بالا، می توانیم ببینیم که تگ حاوی تگ دیگری است ، داده ها و محتوای آنها جایگزین می شود.
()append
افزودن داده / محتویات جدید به تگ موجود با استفاده از متد ()tag.append است. شباهت زیادی به متد ()append در لیست پایتون دارد.
1 2 3 4 5 6 7 |
>>> 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 به راحتی قابل انجام است –
1 2 3 4 5 6 7 8 9 10 |
>>> 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'] |
توجه: اگر هنگام دسترسی به تابع ()NavigableString خطای نامی پیدا کردید، به شرح زیر است
NameError: name ‘NavigableString’ is not defined
فقط پوشه NavigableString را از بسته bs4 وارد کنید –
1 |
>>> from bs4 import NavigableString |
ما می توانیم خطای فوق را برطرف کنیم.
می توانید نظرات خود را به تگ موجود خود اضافه کنید یا می توانید برخی از زیر کلاس های دیگر NavigableString را اضافه کنید، فقط بسازنده را فراخوانی کنید.
1 2 3 4 5 6 7 |
>>> 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 – قابل انجام است –
1 2 3 4 5 6 7 |
>>> 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
مشابه متد ()insert در لیست پایتون ، ()tag.insert عنصر جدیدی را وارد می کند اما برخلاف ()tag.append ، عنصر جدید لزوماً در انتهای مطالب والدین خود قرار نمی گیرد. عنصر جدید را می توان در هر موقعیتی اضافه کرد.
1 2 3 4 5 6 7 8 9 10 11 |
>>> 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 استفاده می کنیم –
1 2 3 4 5 6 7 |
>>> 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 استفاده کنید.
1 2 3 4 5 |
>>> 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 استفاده کنید –
1 2 3 4 5 6 7 8 9 |
>>> 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> |
()extract
برای حذف تگ یا رشته ها از درخت ، از ()PageElement.extract استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> 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 |
()decompose
()tag.decompose یک نگ را از درخت حذف کرده و تمام محتوای آن را پاک می کند.
1 2 3 4 5 6 7 8 9 10 |
>>> 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> >>> |
()Replace_with
همانطور که از نامش پیداست، تابع ()pageElement.replace_with تگ یا رشته قدیمی را با تگ یا رشته جدید در درخت جایگزین می کند –
1 2 3 4 5 6 7 8 9 10 11 |
>>> 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> |
در خروجی بالا، شما متوجه شده اید که ()zëvend_with تگ یا رشته ای را که جایگزین شده است برمی گرداند (مانند “Material” در مورد ما) ، بنابراین می توانید آن را بررسی کنید یا دوباره به قسمت دیگری از درخت اضافه کنید.
()wrap
()pageElement.wrap عنصری را در تگ تعیین شده شما محصور کرده و یک بسته بندی جدید را برمی گرداند –
1 2 3 4 5 6 |
>>> 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> |
()unwrap
()tag.unwrap درست در مقابل ()wrap قرار دارد و هر آنچه درون آن تگ است را جایگزین می کند.
1 2 3 4 5 6 7 |
>>> 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> |
از بالا متوجه شده اید که مانند ()eplace_with(), unwrap تگی را که جایگزین شده است برمی گرداند.
در زیر یک مثال دیگر از ()unwrap برای درک بهتر آن وجود دارد –
1 2 3 4 5 |
>>> 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> |
()unwrap برای حذف نشانه گذاری مناسب است.
دیدگاه شما