BeautifulSoup除了可以查詢和定位網頁內容,還可以修改網頁。修改意味著可以增加或刪除標籤,改變標籤名字,變更標籤屬性,改變文字內容等等。
使用修BeautifulSoup修改標籤
每一個標籤在BeautifulSoup裡面都被當作一個標籤物件,這個物件可以執行以下任務:
- 修改標籤名
- 修改標籤屬性
- 增加新標籤
- 刪除存在的標籤
- 修改標籤的文字內容
修改標籤的名字
只需要修改.name引數就可以修改標籤名字。
- producer_entries.name = "div"<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">怎麼辦嘛</span><img src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\~LWHD)}S}%DE5RTOO[CVEI1.gif" sysface="15" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" alt="" />
修改標籤的屬性
修改標籤的屬性如class,id,style等。因為屬性以字典形式儲存,所以改變標籤屬性就是簡單的處理Python的字典。
更新已經存在屬性的標籤
可以參照如下程式碼:
- producer_entries['id']="producers_new_value"
為一個標籤增加一個新的屬性
比如一個標籤沒有class屬性,那麼可以參照如下程式碼增加class屬性,
- producer_entries['class']='newclass'
刪除標籤屬性
使用del操作符,示例如下:
- del producer_entries['class']
增加一個新的標籤
BeautifulSoup有new_tag()方法來創造一個新的標籤。然後可以使用append(),insert(),insert_after()或者insert_before()等方法來對新標籤進行插入。
增加一個新生產者,使用new_tag()然後append()
參照前面例子,生產者除了plants和alage外,我們現在新增一個phytoplankton.首先,需要先創造一個li標籤。
用new_tag()建立一個新標籤
new_tag()方法只能用於BeautifulSoup物件。現在建立一個li物件。
- soup = BeautifulSoup(html_markup,"lxml")
- new_li_tag = soup.new_tag("li")
new_tag()物件必須的引數是標籤名,其他標籤屬性引數或其他引數都是可選引數。舉例:
- new_atag=soup.new_tag("a",href="www.example.com")
- new_li_tag.attrs={'class':'producerlist'}
使用append()方法新增新標籤
append()方法新增新標籤於,contents之後,就跟python列表方法append()一樣。
- producer_entries = soup.ul
- producer_entries.append(new_li_tag)
li標籤是ul標籤的子代,新增新標籤後的輸出結果。
<ul id="producers">
<li class="producerlist">
<div class="name">
plants
</div>
<div class="number">
100000
</div>
</li>
<li class="producerlist">
<div class="name">
algae
</div>
<div class="number">
100000
</div>
</li>s
<li class="producerlist">
</li>
</ul>
使用insert()向li標籤中新增新的div標籤
append()在.contents之後新增新標籤,而insert()卻不是如此。我們需要指定插入的位置。就跟python中的Insert()方法一樣。
- new_div_name_tag=soup.new_tag("div")
- new_div_name_tag["class"]="name"
- new_div_number_tag=soup.new_tag("div")
- new_div_number_tag["class"]="number"
先是建立兩個div標籤
- new_li_tag.insert(0,new_div_name_tag)
- new_li_tag.insert(1,new_div_number_tag)
- print(new_li_tag.prettify())
然後進行插入,輸出效果如下:
<li class_="producerlist">
<div class="name">
</div>
<div class="number">
</div>
</li>
改變字串內容
在上面例子中,只是新增了標籤,但標籤中卻沒有內容,如果想新增內容的話,BeautifulSoup也可以做到。
使用.string修改字串內容
比如:
- new_div_name_tag.string="phytoplankton"
- print(producer_entries.prettify())
輸出如下:
<ul id="producers">
<li class="producerlist">
<div class="name">
plants
</div>
<div class="number">
100000
</div>
</li>
<li class="producerlist">
<div class="name">
algae
</div>
<div class="number">
100000
</div>
</li>
<li class="producerlist">
<div class="name">
phytoplankton
</div>
<div class="number">
</div>
</li>
</ul>
使用.append/(),insert(),和new_string()新增字串
使用append()和insert()的效果就跟用在新增新標籤中一樣。比如:
- new_div_name_tag.append("producer")
- print(soup.prettify())
輸出:
- <html>
- <body>
- <div class="ecopyramid">
- <ul id="producers">
- <li class="producerlist">
- <div class="name">
- plants
- </div>
- <div class="number">
- 100000
- </div>
- </li>
- <li class="producerlist">
- <div class="name">
- algae
- </div>
- <div class="number">
- 100000
- </div>
- </li>
- <li class="producerlist">
- <strong><div class="name">
- phytoplankton
- producer
- </div>
- </strong><div class="number">
- </div>
- </li>
- </ul>
- </div>
- </body>
- </html>
還有一個new_string()方法,
- new_string_toappend = soup.new_string("producer")
- new_div_name_tag.append(new_string_toappend)
從網頁中刪除一個標籤
刪除標籤的方法有decomose()和extract()方法
使用decompose()刪除生產者
我們現在移去class="name"屬性的div標籤,使用decompose()方法。
- third_producer = soup.find_all("li")[2]
- div_name = third_producer.div
- div_name.decompose()
- print(third_producer.prettify())
輸出:
<li class_="producerlist">
<div class_="number">
10000
</div>
</li>
decompose()方法會移去標籤及標籤的子代。
使用extract()刪除生產者
extract()用於刪除一個HTMNL文件中昂的標籤或者字串,另外,它還返回一個被刪除掉的標籤或字串的控制程式碼。不同於decompose(),extract也可以用於字串。
- third_producer_removed=third_producer.extract()
- print(soup.prettify())
使用BeautifulSoup刪除標籤的內容
標籤可以有一個NavigableString物件或tag物件作為子代。刪除掉這些子代可以使用clear()
舉例,可以移掉帶有plants的div標籤和 相應的class=number屬性標籤。
- li_plants=soup.li
- li_plants.clear()
輸出:
<li class="producerlist"></li>
可以看出跟li相關的標籤內容被刪除乾淨。
修改內容的特別函式
除了我們之前看到的那些方法,BeautifulSoup還有其他修改內容的方法。
- Insert_after()和Insert_before()方法:
這兩個方法用於在標籤或字串之前或之後插入標籤或字串。這個方法需要的引數只有NavigavleString和tag物件。
- soup = BeautifulSoup(html_markup,"lxml")
- div_number = soup.find("div",class_="number")
- div_ecosystem = soup.new_tag("div")
- div_ecosystem['class'] = "ecosystem"
- div_ecosystem.append("soil")
- div_number.insert_after(div_ecosystem)
- print(soup.prettify())
輸出:
<html>
<body>
<div class="ecopyramid">
<ul id="producers">
<li class="producerlist">
<div class="name">
plants
</div>
<div class="number">
100000
</div>
<div class="ecosystem">
soil
</div>
</li>
<li class="producerlist">
<div class="name">
algae
</div>
<div class="number">
100000
</div>
</li>
</ul>
</div>
</body>
</html>
- replace_with()方法:
這個方法用於用一個新的標籤或字串替代原有的標籤或字串。這個方法把一個標籤物件或字串物件作為輸入。replace_with()會返回一個被替代標籤或字串的控制程式碼。
- soup = BeautifulSoup(html_markup,"lxml")
- div_name =soup.div
- div_name.string.replace_with("phytoplankton")
- print(soup.prettify())
replace_with()同樣也可以用於完全的替換掉一個標籤。
- wrap()和unwrap()方法:
wrap()方法用於在一個標籤或字串外包裹一個標籤或字串。比如可以用一個div標籤包裹li標籤裡的全部內容。
- li_tags = soup.find_all("li")
- for li in li_tags:
- <span style="white-space:pre"> </span>new_divtag = soup.new_tag("div")
- <span style="white-space:pre"> </span>li.wrap(new_divtag)
- print(soup.prettify())
而unwrap()就跟wrap()做的事情相反。unwrap()和replace_with()一樣會返回被替代的標籤控制程式碼。