BeautifulSoup

BeautifulSoup实现正则表达式的功能,BeautifulSoup.find(html.text, features='lxml') #features: 指定解析器

BeautifulSoup是一个模块,该模块用于接收html或xml字符串,然后将其格式化,之后可以用它提供的方法快速找到需要的元素。

BeautifulSoup使用示例

1.attr,标签属性操作

from bs4 import BeautifulSoup
from bs4.element import Tag
html_doc=''' <html><head><title>The Dormouse's story</title></head> <body> <a href='https://www.cunzhang.com/'>新华字典</a> <a id='li'>太早</a> <p>asdf</p> <div>喜欢你</div> </body> </html> '''

 

1 soup=BeautifulSoup(html_doc, features='html.parser') #features指定解析器
2 tag=soup.find(name='a')
3 print(tag)
4 tag.attrs['li']='绝对计划' #增加标签属性
5 print(soup)
6 del tag.attrs['li'] #删除属性
7 print(soup)

2.children,所有子标签,且输出的时候“换行”也会输出,但不是标签类型

1 soup=BeautifulSoup(html_doc, features='html.parser') #features指定解析器
2 tag=soup.find('body').children
3 for i in tag:
4     if type(i)==Tag:
5         print(i,type(i))
6     else:
7         continue

3.descendants,所有子子孙孙标签

1 tag=soup.find('body').descendants #找到一个子标签时,会继续找此标签下所有的子标签,即迭代寻找
2 for i in tag:
3     if type(i)==Tag:
4         print(i,type(i))
5     else:
6         continue

4.clear, 将标签内的所有子标签清空(保留标签名)

1 soup.find('body').clear()
2 print(soup)

5.decompose,递归删除所有的标签,不保留标签名

1 soup.find('body').decompose()
2 print(soup)

6.extract,和decompose运行结果相同,但extract会有一个返回值(删除的标签)

1 tag=soup.find('body').extract()
2 print(soup)
3 print(tag)

7.decode, 编码为字符串格式,decode_contents(不含当前标签)

1 tag=soup.find('a')
2 print(tag.decode())

8.encode,编码为字节格式,encode_contents(不含当前标签)

tag=soup.find('a')
print(tag.encode())

9.find, 发现第一个标签

1 tag=soup.find('a')
2 print(tag)

10.find_all,发现所有匹配的标签

1 tag=soup.find_all('a')
2 print(tag)

11.has_attr, 检查标签是否含有该属性

1 tag=soup.find('a')
2 print(tag.has_attr('href'))

12.get_text,获取标签文本内容

1 tag=soup.find('a')
2 print(tag.get_text())

13.index,检查标签在某标签的索引位置

1 tag=soup.find('div')
2 v=tag.index(tag.find('p'))
3 print(v)

14.is_empty_element, 是否空标签或者自闭合标签,如'br', 'hr', 'input'等自闭合标签

1 tag=soup.find('div')
2 print(tag.is_empty_element)

15.当前的关联标签

 1 soup.next
 2 soup.next_element
 3 soup.next_elements
 4 soup.next_sibling
 5 soup.next_siblings
 6 
 7 tag.previous
 8 tag.previous_element
 9 tag.previous_elements
10 tag.previous_sibling
11 tag.previous_siblings
12 
13 tag.parent
14 tag.parents

 

 16.查找某标签的关联标签,参数合find_all标签一样

 1 tag=soup.find('div')
 2 tag.find_next(...)
 3 tag.find_all_next(...)
 4 tag.find_next_sibling(...)
 5 tag.find_next_siblings(...)
 6 
 7 tag.find_previous(...)
 8 tag.find_all_previous(...)
 9 tag.find_previous_sibling(...)
10 tag.find_previous_siblings(...)
11 
12 tag.find_parent(...)
13 tag.find_all_parent(...)

 

 17.select, select_one, CSS选择器

 1 #CSS查找格式,.select
 2 soup.select('title')
 3 soup.select('p nth-of-type(3)')
 4 soup.select('body a')#与第六行区分,一个只找子代,一个找后代
 5 soup.select('html head title')#查找html下的head下的title
 6 tag=soup.select('span,a')#找到span和a标签
 7 soup.select('head > title')
 8 soup.select('p > a')
 9 soup.select('p > a:nth-of-type(2)')
10 soup.select('p > #link1')
11 soup.select('body > a')
12 soup.select('#link1 ~ .sister')
13 soup.select('#link1 + .sister')

 

18.标签的内容,.string,与get_text类似,区别在于前者可以修改

1 tag=soup.find('a')
2 print(tag.string)
3 tag.string='new content'
4 print(tag.string)
5 print(soup)
6 
7 tag=soup.find('body')
8 v=tag.stripped_strings#递归内部获取所有标签的文本
9 print(list(v))

 

19.append,在当前标签内部追加一个标签

 1 tag=soup.find('body')
 2 tag.append(soup.find('a'))#相当于把标签剪切到其后
 3 print(soup)
 4 
 5 #自己创建一个标签并追加
 6 from bs4.element import Tag
 7 
 8 obj=Tag(name='i',attrs={'id':'koudai'})
 9 obj.string='你是谁'
10 tag=soup.find('body')
11 tag.append(obj)
12 print(soup)

 

20.insert在,在当前标签指定位置插入一个标签

1 from bs4.element import Tag
2 
3 obj=Tag(name='i',attrs={'id':'koudai'})
4 obj.string='你是谁'
5 tag=soup.find('body')
6 tag.insert(2,obj)
7 print(soup)

 

21.insert_after, insert_before,在当前标签后面或前面插入

1 from bs4.element import Tag
2 
3 obj=Tag(name='i',attrs={'id':'koudai'})
4 obj.string='你是谁'
5 tag=soup.find('body')
6 tag.insert_after(obj)
7 print(soup)

 

22.replace_with,将当前标签替换为指定标签

1 from bs4.element import Tag
2 
3 obj=Tag(name='i',attrs={'id':'koudai'})
4 obj.string='你是谁'
5 tag=soup.find('a')
6 tag.replace_with(obj)
7 print(soup)

 

23.创建标签之间的关系,但是Html文本对外不发生变化,只在查找标签的时候会起作用

1 tag=soup.find('div')
2 a=soup.find('a')
3 tag.setup(previous_sibling=a)
4 print(tag.previous_sibling)

24.wrap,将指定标签把当前标签包裹起来

1 from bs4.element import Tag
2 
3 obj=Tag(name='i',attrs={'id':'koudai'})
4 obj.string='你是谁'
5 tag=soup.find('a')
6 tag.wrap(obj)
7 print(soup)

 

25.unwrap,去掉当前标签,将保留其包裹的标签

1 from bs4.element import Tag
2 
3 obj=Tag(name='i',attrs={'id':'koudai'})
4 obj.string='你是谁'
5 tag=soup.find('a')
6 tag.wrap(obj)
7 tag.unwrap()
8 print(soup)

 

posted @ 2019-06-18 23:38  czmir  阅读(155)  评论(0编辑  收藏  举报