前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beautiful soup爬虫初识

beautiful soup爬虫初识

作者头像
py3study
发布2018-08-03 11:11:39
7880
发布2018-08-03 11:11:39
举报
文章被收录于专栏:python3

Beautiful Soup的安装,简称bs4

pip3 install bs4

bs4解析器选择

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库执行速度适中文档容错能力强

Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差

lxml HTML 解析器

BeautifulSoup(markup, "lxml")

速度快文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, ["lxml-xml"])BeautifulSoup(markup, "xml")

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

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性以浏览器的方式解析文档生成HTML5格式的文档

速度慢不依赖外部扩展

官方推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定

lxml解析器安装

pip3 install lxml

使用bs4过滤器

自建示例文件scenery.html文件的内容如下:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>武汉旅游景点</title>
    <meta name="description" content="武汉旅游景点 精简版" />
    <meta name="author" content="hstking">
</head>
<body>
    <div id="content">
        <div class="title">
            <h3>武汉景点</h3>
        </div>
        <ul class="table">
            <li>景点<a>门票价格</a></li>
        </ul>
        <ul class="content">
            <li nu="1">东湖 <a class="price">60</a></li>
            <li nu="2">磨山 <a class="price">60</a></li>
            <li nu="3">欢乐谷 <a class="price">108</a></li>
            <li nu="4">武昌极地海洋世界 <a class="price">150</a></li>
            <li nu="5">玛雅水上乐园 <a class="price">150</a></li>
        </ul>
    </div>

</body>
</html>

使用lxml解析器,打印scenery.html内容

代码语言:javascript
复制
from bs4 import BeautifulSoup

# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())

执行结果:  按照标准的缩进格式的结构输出

blob.png
blob.png

bs4解析器lxml练习:

代码语言:javascript
复制
#!/usr/bin/env python
# coding: utf-8
from bs4 import BeautifulSoup

# 使用lxml解析器
soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml')
# prettify按标准的缩进格式的结构输出
print(soup.prettify())

# 获取第一次出现的标签名为ul的标签内容
print(soup.ul)
print('\n')

# 使用bs4过滤器soup.find()的方法获取第一次出现的标签内容
print(soup.find('ul'))
print('\n')

# 使用soup.find_all方法获取所有符合条件的标签列表,然后从列表中读取就行了
print(soup.find_all('ul'))  # 获取所有ul中所有内容
print('\n')

print(soup.find_all('ul')[0])  # 获取第一个ul中的所有内容
print('\n')

print(soup.find_all('ul')[1])  # 获取第二个ul中的所有内容
print('\n')

# 可以用soup.find(TagName, attrs={attrName:attrValue})的方法获取Tag的位置
# 获取li标签nu='3'的内容,适用标签名相同,属性不同的标签
print(soup.find('li', attrs={'nu': '3'}))
print('\n')

# 标签名相同,属性相同,连属性值都相同的标签
# 可以用soup.find_all(TagName,attr={'attName':'attValue'})将符合条件的内容全部放到列表里面
# 找a标签,class='price'的第一个内容
print(soup.find_all('a', attrs={'class': 'price'})[0])
print('\n')

# 获取li标签,nu='2'的内容
Tags = soup.find('li', attrs={'nu': '2'})
print(Tags)
print(Tags.a)  # 获取nu='2'里面的a标签内容
print(Tags.find('a'))  # 获取nu='2'里面的a标签内容
print('\n')

# 获取li标签,nu='4'的内容
Tag = soup.find('li', attrs={'nu': '4'})
print(Tag)

# 获取li标签,nu='4'中nu的值
print(Tag.get('nu'))

# 获取li标签,nu='4'中的文本内容
ss = Tag.get_text()
print(ss)

# 以空格切割上面文本内容拿到第一个值
print(Tag.get_text().split(' ')[0])

# 获取li标签下a标签的文本内容
print(Tag.a.get_text())
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/06/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档