Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻

需求: 使用正则获取腾讯新闻标题内容

网站:https://sports.qq.com/

代码:

import re

import requests
from fake_useragent import UserAgent

url = 'https://sports.qq.com/'
# 构建请求头信息
headers = {'User-Agent':UserAgent().chrome}
# 发送请求
resp = requests.get(url,headers=headers)
# 设置字符集
resp.encoding ='gbk'
# # 保存数据
# with open('tmp.html','w',encoding='utf-8')
as f:
#     f.write(resp.text)
# 匹配数据
rs =  re.findall(r'<li><a target="_blank"
href=".+>(.+)</a></li>',resp.text)
# re.findall(r'<li><a target="_blank"
href=".+?>(.+)</a>',resp.text)

for r in rs:
    print(r)

数据解析-Beautiful Soup的使用 

简介:

        Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。

它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可

以写出一个完整的应用程序。

        Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。不需要考虑

编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。

然后,仅仅需要说明一下原始编码方式就可以了Beautiful Soup已成为和lxml、html6lib一样出色的

python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

官网http://beautifulsoup.readthedocs.io/zh_CN/latest/

Beautiful Soup 安装

pip install beautifulsoup4
pip install bs4

         Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不

安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

pip install lxml

解析器 使用方法优势 劣势
Python标准库BeautifulSoup(markup,“html.parser”)1. Python的内置标准库 2. 执行
速度适中 3.文档容错能力强
Python 2.7.3 or
3.2.2)前 的版本中文
档容错能力差
lxml HTML解析器BeautifulSoup(markup,“lxml”)1. 速度快 2.文档容错能力强 需要安装C语言库
lxml XML 解析器BeautifulSoup(markup,[“lxml”, “xml”])
BeautifulSoup(markup,“xml”)
1. 速度快 2.唯一支持XML的解析
器 3.需要安装C语言库
html5libBeautifulSoup(markup,“html5lib”)1. 最好的容错性 2.以浏览器的方
式解析文档 3.生成HTML5格式的
文档 4.速度慢
不依赖外部扩展
 创建 Beautiful Soup 对象
from bs4 import BeautifulSoup

bs = BeautifulSoup(html,"lxml")

三大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每
个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • Comment 

案例代码

<title>尚学堂</title>
<div class='info' float='left'>Welcome to
SXT</div>
<div class='info' float='right'>
    <span>Good Good Study</span>
    <a href='www.bjsxt.cn'></a>
    <strong><!--没用--></strong>
</div>

Tag

通俗点讲就是 HTML 中的一个个标签
例如: <div> <title>

#以lxml方式解析
soup = BeautifulSoup(info, 'lxml')
print(soup.title)
# <title>尚学堂</title>

注意:

相同的标签只能获取第一个符合要求的标签

获取属性 :

#获取所有属性
print(soup.title.attrs)
#class='info' float='left'

#获取单个属性的值
print(soup.div.get('class'))
print(soup.div['class'])
print(soup.a['href'])
#info

NavigableString获取内容 

print(soup.title.string)
print(soup.title.text)
#尚学堂

Comment

Comment 对象是一个特殊类型的 NavigableString 对象,其实
输出的内容仍然不包括注释符号,但是如果不好好处理它,可
能会对我们的文本处理造成意想不到的麻烦

if type(soup.strong.string) == Comment:
    print(soup.strong.prettify())
else:
    print(soup.strong.string)

数据解析-Beautiful Soup方法的使用 

find_all() 搜索文档树

        Beautiful Soup定义了很多搜索方法,这里着重介绍find_all() 其它方法的参数和用法类似

字符串

        传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容

#返回所有的div标签
print(soup.find_all('div'))

正则表达式 

        传入正则表达式作为参数,Beautiful Soup会通过正则表达式的match() 来匹配内容

#返回所有的div标签
print (soup.find_all(re.compile("^div")))

列表

        传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回

#返回所有匹配到的span a标签
print(soup.find_all(['span','a']))

keyword

        传入一个id 的参数,Beautiful Soup会搜索每个tag的”id”属性

#返回id为welcom的标签
print(soup.find_all(id='welcome'))

True

        True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点

按CSS搜索

        传入一个css,通过 class_ 参数搜索有指定CSS类名的tag

# 返回class等于info的div
print(soup.find_all('div',class_='info'))

按属性的搜索
soup.find_all("div", attrs={"class": "info"})

CSS选择器 

soup.select(参数)

表        达        式说        明
tag选择指定标签
*选择所有节点
#id选择id为container的节点
.class选取所有class包含container的节点
li a选取所有li下的所有a节点
ul + p(兄弟)选择ul后面的第一个p元素
div#id > ul (父子)选取id为id的div的第一个ul子元素
table ~ div选取与table相邻的所有div元素
a[title]选取所有有title属性的a元素
a[class=”title”]选取所有class属性为title值的a
a[href*=”sxt”] sxt的a元素选取所有href属性包含
a[href^=”http”]选取所有href属性值以http开头的a元素
a[href$=”.png”]选取所有href属性值以.png结尾的a元素
input[type="redio"]:checked选取选中的hobby的元素

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值