BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from bs4 import BeautifulSoup
 
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
asdf
    <div class="title">
        <b>The Dormouse's story总共</b>
        <h1>f</h1>
    </div>
<div class="story">Once upon a time there were three little sisters; and their names were
    <a  class="sister0" id="link1">Els<span>f</span>ie</a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</div>
ad<br/>sf
<p class="story">...</p>
</body>
</html>
"""
 
soup = BeautifulSoup(html_doc, features="lxml")
# 找到第一个a标签
tag1 = soup.find(name='a')
# 找到所有的a标签
tag2 = soup.find_all(name='a')
# 找到id=link2的标签
tag3 = soup.select('#link2')

安装:

1
pip3 install beautifulsoup4

使用示例:

1
2
3
4
5
6
7
8
9
10
11
from bs4 import BeautifulSoup
 
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
    ...
</body>
</html>
"""
 
soup = BeautifulSoup(html_doc, features="lxml")

一:对象种类

  (1)Tag  

   标记

  soup对象本身比较特殊,它的name为[document],对于其他内部标记,输出的值为标记本身的名称

抽取title:  print soup.title
抽取a : print soup.a
抽取p : print soup.a

Tag不仅可以获取name ,还可以修改name

soup.title.name = 'mytitle'

属性

print soup.p['class']
print soup.p.get('class')

(2)NavigableString

     获取标记内部的文字

print soup.p.string

转换成unicode字符串

  unicode_string = unicode(soup.p.string)

(3 )BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

print type(soup.name)

(4)Comment

  Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号

三:

  遍历文档数:

  (1)子节点

    要点:.contents  .children  属性

    

tag 的 .content 属性可以将tag的子节点以列表的方式输出

 
 
1
2
print soup.head.contents 
#[<title>The Dormouse's story</title>]

输出方式为列表,我们可以用列表索引来获取它的某一个元素

 
 
1
2
print soup.head.contents[0]
#<title>The Dormouse's story</title>

   .children

它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。

我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象

 
 
1
2
print soup.head.children
#<listiterator object at 0x7f71457f5710>

我们怎样获得里面的内容呢?很简单,遍历一下就好了,代码及结果如下

 
 
1
2
for child in  soup.body.children:
    print child
 
 
1
2
3
4
5
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>,
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and

 (2)父节点

  

它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。

我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象

 
 
1
2
print soup.head.children
#<listiterator object at 0x7f71457f5710>

我们怎样获得里面的内容呢?很简单,遍历一下就好了,代码及结果如下

 
 
1
2
for child in  soup.body.children:
    print child
 
 
1
2
3
4
5
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>,
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and

 (2)所有子孙节点

 

1. name,标签名称

1 # tag = soup.find('a')
2 # name = tag.name # 获取
3 # print(name)
4 # tag.name = 'span' # 设置
5 # print(soup)

2. attr,标签属性

1 # tag = soup.find('a')
2 # attrs = tag.attrs # 获取
3 # print(attrs)
4 # tag.attrs = {'ik':123} # 设置
5 # tag.attrs['id'] = 'iiiii' # 设置
6 # print(soup)

3. children,所有子标签

1 # body = soup.find('body')
2 # v = body.children

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

1 # body = soup.find('body')
2 # v = body.descendants

5. clear,将标签的所有子标签全部清空(保留标签名)

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

6. decompose,递归的删除所有的标签

1 # body = soup.find('body')
2 # body.decompose()
3 # print(soup)

7. extract,递归的删除所有的标签,并获取删除的标签

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

8. decode,转换为字符串(含当前标签);decode_contents(不含当前标签)

1 # body = soup.find('body')
2 # v = body.decode()
3 # v = body.decode_contents()
4 # print(v)

9. encode,转换为字节(含当前标签);encode_contents(不含当前标签)

1 # body = soup.find('body')
2 # v = body.encode()
3 # v = body.encode_contents()
4 # print(v)

10. find,获取匹配的第一个标签

1 # tag = soup.find('a')
2 # print(tag)
3 # tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
4 # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
5 # print(tag)

11. find_all,获取匹配的所有标签

 1 # tags = soup.find_all('a')
2 # print(tags)
3
4 # tags = soup.find_all('a',limit=1)
5 # print(tags)
6
7 # tags = soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
8 # # tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
9 # print(tags)
10
11
12 # ####### 列表 #######
13 # v = soup.find_all(name=['a','div'])
14 # print(v)
15
16 # v = soup.find_all(class_=['sister0', 'sister'])
17 # print(v)
18
19 # v = soup.find_all(text=['Tillie'])
20 # print(v, type(v[0]))
21
22
23 # v = soup.find_all(id=['link1','link2'])
24 # print(v)
25
26 # v = soup.find_all(href=['link1','link2'])
27 # print(v)
28
29 # ####### 正则 #######
30 import re
31 # rep = re.compile('p')
32 # rep = re.compile('^p')
33 # v = soup.find_all(name=rep)
34 # print(v)
35
36 # rep = re.compile('sister.*')
37 # v = soup.find_all(class_=rep)
38 # print(v)
39
40 # rep = re.compile('http://www.oldboy.com/static/.*')
41 # v = soup.find_all(href=rep)
42 # print(v)
43
44 # ####### 方法筛选 #######
45 # def func(tag):
46 # return tag.has_attr('class') and tag.has_attr('id')
47 # v = soup.find_all(name=func)
48 # print(v)
49
50
51 # ## get,获取标签属性
52 # tag = soup.find('a')
53 # v = tag.get('id')
54 # print(v)

12. has_attr,检查标签是否具有该属性

1 # tag = soup.find('a')
2 # v = tag.has_attr('id')
3 # print(v)

13. get_text,获取标签内部文本内容

1 # tag = soup.find('a')
2 # v = tag.get_text('id')
3 # print(v)

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

1 # tag = soup.find('body')
2 # v = tag.index(tag.find('div'))
3 # print(v)
4
5 # tag = soup.find('body')
6 # for i,v in enumerate(tag):
7 # print(i,v)

15. is_empty_element,是否是空标签(是否可以是空)或者自闭合标签,

判断是否是如下标签:'br' , 'hr', 'input', 'img', 'meta','spacer', 'link', 'frame', 'base'

1 # tag = soup.find('br')
2 # v = tag.is_empty_element
3 # print(v)

16. 当前的关联标签

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

17. 查找某标签的关联标签

 1 # tag.find_next(...)
2 # tag.find_all_next(...)
3 # tag.find_next_sibling(...)
4 # tag.find_next_siblings(...)
5
6 # tag.find_previous(...)
7 # tag.find_all_previous(...)
8 # tag.find_previous_sibling(...)
9 # tag.find_previous_siblings(...)
10
11 # tag.find_parent(...)
12 # tag.find_parents(...)
13
14 # 参数同find_all

18. select,select_one, CSS选择器

 1 soup.select("title")
2
3 soup.select("p nth-of-type(3)")
4
5 soup.select("body a")
6
7 soup.select("html head title")
8
9 tag = soup.select("span,a")
10
11 soup.select("head > title")
12
13 soup.select("p > a")
14
15 soup.select("p > a:nth-of-type(2)")
16
17 soup.select("p > #link1")
18
19 soup.select("body > a")
20
21 soup.select("#link1 ~ .sister")
22
23 soup.select("#link1 + .sister")
24
25 soup.select(".sister")
26
27 soup.select("[class~=sister]")
28
29 soup.select("#link1")
30
31 soup.select("a#link2")
32
33 soup.select('a[href]')
34
35 soup.select('a[href="http://example.com/elsie"]')
36
37 soup.select('a[href^="http://example.com/"]')
38
39 soup.select('a[href$="tillie"]')
40
41 soup.select('a[href*=".com/el"]')
42
43
44 from bs4.element import Tag
45
46 def default_candidate_generator(tag):
47 for child in tag.descendants:
48 if not isinstance(child, Tag):
49 continue
50 if not child.has_attr('href'):
51 continue
52 yield child
53
54 tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator)
55 print(type(tags), tags)
56
57 from bs4.element import Tag
58 def default_candidate_generator(tag):
59 for child in tag.descendants:
60 if not isinstance(child, Tag):
61 continue
62 if not child.has_attr('href'):
63 continue
64 yield child
65
66 tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
67 print(type(tags), tags)

19. 标签的内容

 1 # tag = soup.find('span')
2 # print(tag.string) # 获取
3 # tag.string = 'new content' # 设置
4 # print(soup)
5
6 # tag = soup.find('body')
7 # print(tag.string)
8 # tag.string = 'xxx'
9 # print(soup)
10
11 # tag = soup.find('body')
12 # v = tag.stripped_strings # 递归内部获取所有标签的文本
13 # print(v)

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

 1 # tag = soup.find('body')
2 # tag.append(soup.find('a'))
3 # print(soup)
4 #
5 # from bs4.element import Tag
6 # obj = Tag(name='i',attrs={'id': 'it'})
7 # obj.string = '我是一个新来的'
8 # tag = soup.find('body')
9 # tag.append(obj)
10 # print(soup)

21.insert在当前标签内部指定位置插入一个标签

1 # from bs4.element import Tag
2 # obj = Tag(name='i', attrs={'id': 'it'})
3 # obj.string = '我是一个新来的'
4 # tag = soup.find('body')
5 # tag.insert(2, obj)
6 # print(soup)

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

1 # from bs4.element import Tag
2 # obj = Tag(name='i', attrs={'id': 'it'})
3 # obj.string = '我是一个新来的'
4 # tag = soup.find('body')
5 # # tag.insert_before(obj)
6 # tag.insert_after(obj)
7 # print(soup)

23. replace_with 在当前标签替换为指定标签

1 # from bs4.element import Tag
2 # obj = Tag(name='i', attrs={'id': 'it'})
3 # obj.string = '我是一个新来的'
4 # tag = soup.find('div')
5 # tag.replace_with(obj)
6 # print(soup)

24. 创建标签之间的关系(但不会改变标签的位置)

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

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

 1 # from bs4.element import Tag
2 # obj1 = Tag(name='div', attrs={'id': 'it'})
3 # obj1.string = '我是一个新来的'
4 #
5 # tag = soup.find('a')
6 # v = tag.wrap(obj1)
7 # print(soup)
8
9 # tag = soup.find('a')
10 # v = tag.wrap(soup.find('p'))
11 # print(soup)

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

1 # tag = soup.find('a')
2 # v = tag.unwrap()
3 # print(soup)

转载自:

http://www.cnblogs.com/wupeiqi/articles/6283017.html

python 爬虫 之BeautifulSoup的更多相关文章

  1. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

  2. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  3. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  4. Python爬虫之BeautifulSoup的用法

    之前看静觅博客,关于BeautifulSoup的用法不太熟练,所以趁机在网上搜索相关的视频,其中一个讲的还是挺清楚的:python爬虫小白入门之BeautifulSoup库,有空做了一下笔记: 一.爬 ...

  5. Python爬虫系列-BeautifulSoup详解

    安装 pip3 install beautifulsoup4 解析库 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(markup,'html,parser') Pyth ...

  6. Python爬虫之Beautifulsoup模块的使用

    一 Beautifulsoup模块介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Be ...

  7. Python 爬虫—— requests BeautifulSoup

    本文记录下用来爬虫主要使用的两个库.第一个是requests,用这个库能很方便的下载网页,不用标准库里面各种urllib:第二个BeautifulSoup用来解析网页,不然自己用正则的话很烦. req ...

  8. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门【华为云技术分享】

    久旱逢甘霖 西安连着几天温度排行全国三甲,也许是<哪吒之魔童降世>的剧组买通了老天,从踩着风火轮的小朋友首映开始,就全国性的持续高温,还好今天凌晨的一场暴雨,算是将大家从中暑边缘拯救回来了 ...

  9. python爬虫之BeautifulSoup

    爬虫有时候写正则表达式会有假死现象 就是正则表达式一直在进行死循环查找 例如:https://social.msdn.microsoft.com/forums/azure/en-us/3f4390ac ...

  10. python爬虫入门--beautifulsoup

    1,beautifulsoup的中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 2, from bs4 import Be ...

随机推荐

  1. IDEA运行后控制台输出乱码

    1.点击 2.点击 3.添加:-Dfile.encoding=UTF-8 . 4.点击OK

  2. python基础9 -----python内置函数2

    一.python内置所以函数     Built-in Functions     abs() divmod() input() open() staticmethod() all() enumera ...

  3. 第14条:尽量用异常来表示特殊情况,而不要返回Nono

    核心知识点: 1.用None这个返回值来表示特殊意义的函数,很容易使调用者犯错,因为None和0以及空字符串之类的值,在条件表达式里都会评估为False. 2.两种方法:二元法:将异常抛给上一级直接报 ...

  4. 【LeetCode】【找元素】Find First and Last Position of Element in Sorted Array

    描述: Given an array of integers nums sorted in ascending order, find the starting and ending position ...

  5. 经典c语言题

    1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标 ...

  6. nodejs模块之fs&&stream

    nodejs的文件系统fs模块,可以实现对文件.目录等的操作,stream模块实现对文件数据的断续读写操作 一.文件操作 fs.readFile(file[,options],callback) 异步 ...

  7. 【Flask】filter 常用查询条件

    1. equal    2. not equal  3. like, ilike  4.in  5. not in 6. is null  7. is not null  8. and  9. or ...

  8. hd acm1008

    Problem Description The highest building in our city has only one elevator. A request list is made u ...

  9. 20165101刘天野 2018-2019-2《网络对抗技术》Exp7 网络欺诈防范

    目录 20165101刘天野 2018-2019-2<网络对抗技术>Exp7 网络欺诈防范 1.实验内容 1.1 简单应用SET工具建立冒名网站 1.2 ettercap DNS spoo ...

  10. uboot 2013.01 代码简析(3)第二阶段初始化

    u-boot第二阶段初始化内容的入口函数是_main,_main位于arch/arm/lib/crt0.S文件中: _main函数中先为调用board_init_f准备初始化环境(设置栈指针sp和并给 ...