Python学习笔记----爬虫利器---Beautiful Soup

1.Beautiful Soup简介

2.Beautiful Soup安装

3.Beautiful Soup解析库

4.Beautiful Soup四大对象种类

5.Beautiful Soup使用示例----遍历文档树,搜索文档树和CSS选择器

 

1.Beautiful Soup简介

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

2.Beautiful Soup安装

pip3 install beautifulsoup4

Beautiful Soup支持Python标准库中的HTML解析器,也支持一些第三方的解析器,推荐用lxml,速度快

pip3 install lxml

 

3.Beautiful Soup解析库

序号 解析库 使用方法 优势 劣势
1 Python标准库 BeautifulSoup(html,’html.parser’) Python内置标准库;执行速度适中,文档容错能力强

Python 2.7.3 or 3.2.2前的版本容错能力较差
2 lxml HTML解析库 BeautifulSoup(html,’lxml’) 速度快;容错能力强 需要安装,需要C语言库
3 lxml XML解析库 BeautifulSoup(html,[‘lxml’,’xml’])

速度快,唯一支持XML的解析器

需要C语言库
4 htm5lib解析库 BeautifulSoup(html,’htm5llib’) 以浏览器方式解析,最好的容错性,生成HTML5格式的文档 速度慢,不依赖外部扩展

 

4.Beautiful Soup四大对象种类(Tag,NavigableString,BeautifulSoup,Commen)

4.1 Tag

id和class选择器, class比较特殊, 因为是关键字 在使用class时改成class_

 

使用 .属性名 的方法, 但是只能获取到一个

使用元素.attrs['属性名']的方法返回的时一个列表
如果使用两次 soup.元素 第一次获取的是匹配到的第一个元素, 第二次是匹配到的第二个元素

获取多个元素
find方法获取一个元素
find_all获取多个元素, 可以加上limit来达到限制个数的问题, recursive = True 寻找子孙 ; recursive = False只找子
多层级查找 find_all返回的是一个列表 可以遍历该列表再次使用find方法或者find_all方法 进行元素的获取

print(soup.find(id='a'))
print(soup.find('a', id='a'))
print(soup.find_all('a', id='a'))  # 可以使用下标查询

# class是关键字 要这么写class_

print('class1', soup.find_all('a', class_='a'))
print('class2', soup.find_all('a', attrs={'class': 'item'}))  # 更通用
print('class3', soup.find_all('a', attrs={'class': 'item', 'id': 'a'}))  # 多条件

获取标签及一个子标签

print(soup.li.get_text())  # 匹配到第一个,返回所有节点的文本信息
print(soup.find('li').text)
# 获取ul的子标签们   (空行也看成了一个children)
print(soup.ul.children)
for index, item in enumerate(soup.ul.children):
    print(index, item)
获取标题内容
print(soup.title)  # <title>xPath方法</title>
# 获取标题内容
print(soup.title.string)  # 返回迭代器
print(soup.title.text)
print(soup.title.get_text())
print(soup.find('title').get_text())

通过上下级获得对象

# print(soup.title.parent)   # 返回父节点包括父节点中的内容
print(soup.li.child)  # Node
print(soup.li.children)  # 返回一个迭代器

使用函数作为参数, 返回元素

def check_tag_existed(tag):
    if tag == 'a':
        return True

print(soup.find_all(class_=check_tag_existed))
使用find_all()方法通过标签名称查找a标签
print('所有a标签的内容:', soup.find_all('a')) # 使用find_all()方法通过标签名称查找a标签,返回的是一个列表类型
print('a标签和b标签的内容:', soup.find_all(['a', 'b']))  # 把a标签和b标签作为一个列表传递,可以一次找到a标签和b标签

使用select选择器,找到div标签中,id=‘nav_menu’的导航条

print('抓取导航,实现方法1')
for item in soup.select('div#nav_menu a'):
    print(item.get('href'), item.string)

print('抓取导航,实现方法2')
for item in soup.find('div', {'id':'nav_menu'}).children:
    print(item['href'], item.string)

获取友情链接

#<div class="link-list friend-link" id="friend_link">
#<a href="//www.aliyun.com" target="_blank">阿里云</a>
#<a href="//cloud.tencent.com" target="_blank">腾讯云</a>
#</div>
print(soup.find('div', {'class':{'link-list','friend-link'}}))

 

 

 


4.2 NavigableString

 

 


4.3 BeautifulSoup


4.4 Comment

 

 

5.Beautiful Soup使用示例----遍历文档树,搜索文档树和CSS选择器

上一篇:Javascript里的onkeydown事件


下一篇:BeautifulSoup4的简单应用