天天看點

Python爬蟲之BeautifulSoup庫(五):修改文檔樹

from bs4 import BeautifulSoup
           

一、修改tag的名稱和屬性

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
tag = soup.b
tag
           
<b class="boldest">Extremely bold</b>
           

修改name和屬性

tag.name = "blockquote" # 修改name
tag['class'] = 'verybold' # 修改屬性
tag['id'] =  # 添加屬性
tag
           
<blockquote class="verybold" id="1">Extremely bold</blockquote>
           

删除屬性

# 删除屬性
del tag['class']
del tag['id']
tag
           
<blockquote>Extremely bold</blockquote>
           

二、修改.string:修改文本内容

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')

tag = soup.a
tag.string = "New link text."
tag
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >New link text.</a>
           

三、為文本(.string)追加内容:append()

soup = BeautifulSoup("<a>Foo</a>",'lxml')
soup.a.append("Bar")
print(soup)
print(soup.a.contents)
           
<html><body><a>FooBar</a></body></html>
['Foo', 'Bar']
           

四、建立新文本(string)和新标簽:new_string()和new_tag()

插入新文本

soup = BeautifulSoup("<b></b>",'lxml')
tag = soup.b
tag.append("Hello")
print(tag)
new_string = soup.new_string(" there")
tag.append(new_string)
print(tag)
           
<b>Hello</b>
<b>Hello there</b>
           

插入注釋

from bs4 import Comment
new_comment = soup.new_string("Nice to see you.", Comment)
tag.append(new_comment)
tag
           
<b>Hello there<!--Nice to see you.--></b>
           

建立新tag(第一個參數是name是必填的,其他參數選填)

soup = BeautifulSoup("<b></b>",'lxml')
original_tag = soup.b

new_tag = soup.new_tag("a", href="http://www.example.com")
original_tag.append(new_tag)
original_tag
           
<b><a href="http://www.example.com" target="_blank" rel="external nofollow" ></a></b>
           

五、插入:insert()、insert_before()和insert_after()

insert():插入到指定位置,第一個參數是位置,第二個産生時内容

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
tag = soup.a

tag.insert(, "but did not endorse ")
print(tag)
print(tag.contents)
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to but did not endorse <i>example.com</i></a>
['I linked to ', 'but did not endorse ', <i>example.com</i>]
           

insert_before():目前tag前插入内容

soup = BeautifulSoup("<b>stop</b>",'lxml')
tag = soup.new_tag("i")
tag.string = "Don't"
soup.b.string.insert_before(tag)
soup.b
           
<b><i>Don't</i>stop</b>
           

insert_after():目前tag後插入内容

soup.b.i.insert_after(soup.new_string(" ever "))
soup.b
           
<b><i>Don't</i> ever stop</b>
           

六、移除:clear()、extract()和decompose()

clear():清除目前節點中的内容

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
tag = soup.a
tag.clear()
tag
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ></a>
           

extract():将目前節點從文檔樹上移除,并作為方法結果傳回

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
a_tag = soup.a
i_tag = soup.i.extract()
print(a_tag)
print(i_tag)
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to </a>
<i>example.com</i>
           

decompose():将目前節點從文檔樹中移除并完全銷毀

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
a_tag = soup.a
soup.i.decompose()
a_tag
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to </a>
           

七、替換與包裝:replace_with()、wrap()和unwarp()

replace_with():将目前節點替換為新的節點

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
a_tag = soup.a
new_tag = soup.new_tag("b")
new_tag.string = "example.net"
print(new_tag)
a_tag.i.replace_with(new_tag)
print(a_tag)
           
<b>example.net</b>
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <b>example.net</b></a>
           

wrap():為目前節點的外部包裝上新的節點

soup = BeautifulSoup("<p>I wish I was bold.</p>",'lxml')
soup.p.string.wrap(soup.new_tag("b"))
soup.p.wrap(soup.new_tag("div"))
           
<div><p><b>I wish I was bold.</b></p></div>
           

unwarp():将目前節點中最外部的tag去掉

markup = '<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
a_tag = soup.a
a_tag.i.unwrap()
a_tag
           
<a href="http://example.com/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >I linked to example.com</a>
           

繼續閱讀