ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 这是Beautiful Soup 4.2.1 中新增的方法 创建一个tag最好的方法是调用工厂方法 `BeautifulSoup.new_tag()` : ``` soup = BeautifulSoup("<b></b>") 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"></a></b> new_tag.string = "Link text." original_tag # <b><a href="http://www.example.com">Link text.</a></b> ``` 第一个参数作为tag的name,是必填,其它参数选填 ## insert() `Tag.insert()` 方法与 `Tag.append()` 方法类似,区别是不会把新元素添加到父节点 `.contents` 属性的最后,而是把元素插入到指定的位置.与Python列表总的 `.insert()` 方法的用法下同: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) tag = soup.a tag.insert(1, "but did not endorse ") tag # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a> tag.contents # [u'I linked to ', u'but did not endorse', <i>example.com</i>] ``` ## insert_before() 和 insert_after() `insert_before()` 方法在当前tag或文本节点前插入内容: ``` soup = BeautifulSoup("<b>stop</b>") 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> soup.b.contents # [<i>Don't</i>, u' ever ', u'stop'] ``` ## clear() `Tag.clear()` 方法移除当前tag的内容: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) tag = soup.a tag.clear() tag # <a href="http://example.com/"></a> ``` ## extract() `PageElement.extract()` 方法将当前tag移除文档树,并作为方法结果返回: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a i_tag = soup.i.extract() a_tag # <a href="http://example.com/">I linked to</a> i_tag # <i>example.com</i> print(i_tag.parent) None ``` 这个方法实际上产生了2个文档树: 一个是用来解析原始文档的 `BeautifulSoup` 对象,另一个是被移除并且返回的tag.被移除并返回的tag可以继续调用 `extract` 方法: ``` my_string = i_tag.string.extract() my_string # u'example.com' print(my_string.parent) # None i_tag # <i></i> ``` ## decompose() `Tag.decompose()` 方法将当前节点移除文档树并完全销毁: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a soup.i.decompose() a_tag # <a href="http://example.com/">I linked to</a> ``` ## replace_with() `PageElement.replace_with()` 方法移除文档树中的某段内容,并用新tag或文本节点替代它: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a new_tag = soup.new_tag("b") new_tag.string = "example.net" a_tag.i.replace_with(new_tag) a_tag # <a href="http://example.com/">I linked to <b>example.net</b></a> ``` `replace_with()` 方法返回被替代的tag或文本节点,可以用来浏览或添加到文档树其它地方 ## wrap() `PageElement.wrap()` 方法可以对指定的tag元素进行包装 \[8\] ,并返回包装后的结果: ``` soup = BeautifulSoup("<p>I wish I was bold.</p>") soup.p.string.wrap(soup.new_tag("b")) # <b>I wish I was bold.</b> soup.p.wrap(soup.new_tag("div")) # <p><b>I wish I was bold.</b></p> ``` 该方法在 Beautiful Soup 4.0.5 中添加 ## unwrap() `Tag.unwrap()` 方法与 `wrap()` 方法相反.将移除tag内的所有tag标签,该方法常被用来进行标记的解包: ``` markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) a_tag = soup.a a_tag.i.unwrap() a_tag # <a href="http://example.com/">I linked to example.com</a> ``` 与 `replace_with()` 方法相同, `unwrap()` 方法返回被移除的tag