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

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

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

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

代码:

python 复制代码
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语言库 | |
| html5lib | BeautifulSoup(markup,"html5lib") | 1. 最好的容错性 2.以浏览器的方 式解析文档 3.生成HTML5格式的 文档 4.速度慢 | 不依赖外部扩展 |

创建 Beautiful Soup 对象
python 复制代码
from bs4 import BeautifulSoup

bs = BeautifulSoup(html,"lxml")
三大对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每

个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • Comment

案例代码

html 复制代码
<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>

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

注意:

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

获取属性 :

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

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

NavigableString获取内容

python 复制代码
print(soup.title.string)
print(soup.title.text)
#尚学堂

Comment

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

python 复制代码
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会查找与字符串完整匹配的内容

python 复制代码
#返回所有的div标签
print(soup.find_all('div'))
正则表达式

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

python 复制代码
#返回所有的div标签
print (soup.find_all(re.compile("^div")))
列表

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

python 复制代码
#返回所有匹配到的span a标签
print(soup.find_all(['span','a']))
keyword

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

python 复制代码
#返回id为welcom的标签
print(soup.find_all(id='welcome'))
True

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

按CSS搜索

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

python 复制代码
# 返回class等于info的div
print(soup.find_all('div',class_='info'))
按属性的搜索
python 复制代码
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的元素 |

相关推荐
yaoh.wang4 小时前
力扣(LeetCode) 13: 罗马数字转整数 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
小鸡吃米…5 小时前
Python PyQt6教程七-控件
数据库·python
1916zz5 小时前
Extreme programing 方利喆 _ 江贤晟
python
长安牧笛5 小时前
智能鞋柜—脚气终结者,内置温湿度传感器和紫外线灯,晚上回家,把鞋放进去,自动检测湿度,湿度超标就启动烘干+紫外线杀菌,第二天穿鞋干燥无异味。
python
weixin_457760006 小时前
PIL库将图片位深度是1、8、32统一转换为24的方法
python
德迅云安全—珍珍6 小时前
如何有效防护恶意爬虫
爬虫
Lucky高7 小时前
Pandas库入门
python·pandas
小鸡吃米…7 小时前
Python PyQt6教程三-菜单与工具栏
开发语言·python
Jack电子实验室7 小时前
【杭电HDU】校园网(DeepL/Srun)自动登录教程
python·嵌入式硬件·计算机网络·自动化
木头左7 小时前
二值化近似计算在量化交易策略中降低遗忘门运算复杂度
python