python爬虫四种数据解析(XPath解析数据&BeautifulSoup解析数据&re正则表达式&pyquery解析数据)(4)


前言

python学习笔记 (仅供学习使用)


一、XPath解析数据

1.XPath

全称: XML Path Language是一种小型的查询语言
是一门在XML文档中查找信息的语言

XPath的优点
可在XML中查找信息
支持HTML的查找
可通过元素和属性进行导航
Xpath需要依赖lxml库
安装方式 : pip3 install lxml

2.xml的树形结构

在这里插入图片描述

3.使用XPath选取节点

在这里插入图片描述

在这里插入图片描述
xpath的使用:


import  requests
from lxml import  etree
# url='https://www.qidian.com/rank/yuepiao'
url = 'https://m.qidian.com/'
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}

#发送请求
resp=requests.get(url,headers)
e=etree.HTML(resp.text)  #类型转换 将str类型转换成class 'lxml.etree._Element'
#print(type(e))
print(resp.text)
# names=e.xpath('//div[@class="book-mid-info"]/h4/a.txt/text()')
# authors=e.xpath('//p[@class="author"]/a.txt[1]/text()')
names=e.xpath('//div[@class="module-slide"]/ol/li/a[1]/figcaption[1]/text()')
print(names)
# print(authors)
# for name,author in zip(names,authors):
#     print(name,":",author)


# //div[@class="module-slide"]/ol/li/a[1]/figcaption[1]/text()
# https://m.qidian.com/

二、BeautifulSoup解析数据

1.BeautifulSoup简介

BeautifulSoup
是一个可以从HTML或XML文件中提取数据的Python库。其功能简单而强大、容错能力高、文档相对完善,清晰易懂
非Python标准模块,需要安装才能使用
安装方式
pip3 install bs4
测试方式
import bs4

2.解析器

BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果不安装第三方解析器,则Python会使用默认解析器
在这里插入图片描述
在这里插入图片描述

3.代码:


from  bs4 import  BeautifulSoup

html='''
    <html>
        <head>
            <title>小周周</title>
        </head>
        <body>
            <h1 class="info bg" float='left'>欢迎大家来到马士兵教育</h1>
            <a href="http://www.baidu.com"> 百度</a.txt>
            <h2><!--注释的内容--></h2>
        </body>
    </html>

'''
#bs=BeautifulSoup(html,'html.parser')
bs=BeautifulSoup(html,'lxml')
print(bs.title)   #获取标签
print(bs.h1.attrs)  #获取h1标签的所有属性

#获取单个属性
print(bs.h1.get('class'))
print(bs.h1['class'])
print(bs.a['href'])

#获取文本内容
print(bs.title.text)
print(bs.title.string)

#获取内容
print('--------',bs.h2.string)  #获取到h2标签中的注释的文本内容  获取所有内容
print(bs.h2.text)     #因为h2标签中没有正而八经的文本内容    获取文本内容

run:

<title>小周周</title>
{'class': ['info', 'bg'], 'float': 'left'}
['info', 'bg']
['info', 'bg']
http://www.baidu.com
小周周
小周周
-------- 注释的内容

two:


from  bs4 import  BeautifulSoup

html='''
    <title>你好啊</title>
    <div class="info" float="left">欢迎来到异世界</div>
    <div class="info" float="right" id="gb">
        <span>好好学习,天天向上</span>
        <a.txt href="http://www.baidu.com">官网</a.txt>
    </div>
    <span>你好,Python</span>
'''
bs=BeautifulSoup(html,'lxml')
print(bs.title,type(bs.title))
print(bs.find('div',class_='info'),type(bs.find('div',class_='info')))  #获取第一个满足条件的标签
print('--------------------------------------')
print(bs.find_all('div',class_='info'))  #得到的是一个标签的列表
print('--------------------------------------')
for item in bs.find_all('div',class_='info'):
    print(item,type(item))
print('--------------------------------------')
print(bs.find_all('div',attrs={'float':'right'}))

print('===============CSS选择器=======================')
print(bs.select("#gb"))
print('--------------------------------------')
print(bs.select('.info'))
print('--------------------------------------')
print(bs.select('div>span'))  #div下面的span
print('--------------------------------------')
print(bs.select('div.info>span'))

for item in bs.select('div.info>span'):
    print(item.text)

run:

<title>你好啊</title> <class 'bs4.element.Tag'>
<div class="info" float="left">欢迎来到异世界</div> <class 'bs4.element.Tag'>
--------------------------------------
[<div class="info" float="left">欢迎来到异世界</div>, <div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a.txt href="http://www.baidu.com">官网</a.txt>
</div>]
--------------------------------------
<div class="info" float="left">欢迎来到异世界</div> <class 'bs4.element.Tag'>
<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a.txt href="http://www.baidu.com">官网</a.txt>
</div> <class 'bs4.element.Tag'>
--------------------------------------
[<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a.txt href="http://www.baidu.com">官网</a.txt>
</div>]
===============CSS选择器=======================
[<div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a.txt href="http://www.baidu.com">官网</a.txt>
</div>]
--------------------------------------
[<div class="info" float="left">欢迎来到异世界</div>, <div class="info" float="right" id="gb">
<span>好好学习,天天向上</span>
<a.txt href="http://www.baidu.com">官网</a.txt>
</div>]
--------------------------------------
[<span>好好学习,天天向上</span>]
--------------------------------------
[<span>好好学习,天天向上</span>]
好好学习,天天向上

三、用beautifulsoup爬淘宝首页

import  requests
from  bs4 import  BeautifulSoup
url='https://www.taobao.com/'
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}
resp=requests.get(url,headers)
# print(resp.text)
bs=BeautifulSoup(resp.text,'lxml')
a_list=bs.find_all('a')
#print(len(a_list))
for a in a_list:
    url=a.get('href')
    #print(url)
    if url==None:
        continue
    if url.startswith('http') or url.startswith('https'):
        print(url)

run:

http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=T恤&refpid=420462_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f67
https://s.taobao.com/search?q=%E5%A5%B3%E9%9E%8B&refpid=420466_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f68
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=短裤&refpid=430145_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f69
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=半身裙&refpid=430146_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f70
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=男士外套&refpid=430147_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f70
https://s.taobao.com/search?q=墙纸&refpid=430148_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f70
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=行车记录仪&refpid=420467_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f69
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=男鞋&refpid=430144_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f69
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=耳机&refpid=420463_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f67
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=女包&refpid=420464_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f68
http://s.taobao.com/search?spm=1.7274553.1997520241-2.2.TpEKPQ&q=沙发&refpid=420465_1006&source=tbsy&style=grid&tab=all&pvid=d0f2ec2810bcec0d5a16d5283ce59f68
https://market.m.taobao.com/app/fdilab/download-page/main/index.html

四、re正则表达式

是一个特殊的字符序列,它能帮助用户便捷地检查一个字符串是否与某种模式匹配。
Python的正则模块是re,是Python的内置模块,不需要安装,导入即可
在这里插入图片描述
特殊序列:
在这里插入图片描述
正则处理函数:
在这里插入图片描述

import  re
s='Istudy study Python3.8 every day'
print('----------------match方法,从起始位置开始匹配------------')
print(re.match('I',s).group())
print(re.match('\w',s).group())
print(re.match('.',s).group())

print('---------------search方法,从任意位置开始匹配,匹配第一个---------------')
print(re.search('study',s).group())
print(re.search('s\w',s).group())

print('---------------findall方法,从任意位置开始匹配,匹配多个-----------------')
print(re.findall('y',s))  #结果为列表
print(re.findall('Python',s))
print(re.findall('P\w+.\d',s))
print(re.findall('P.+\d',s))

print('--------------sub方法的使用,替换功能-------------------------')
print(re.sub('study','like',s))
print(re.sub('s\w+','like',s))


爬虫糗事百科中的视频:

import  requests
import  re
url='https://www.qiushibaike.com/video/'
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}
resp=requests.get(url,headers=headers)
#print(resp.text)
info=re.findall('<source src="(.*)" type=\'video/mp4\' />',resp.text)
#print(info)
lst=[]
for item in info:
    lst.append('https:'+item)
#print(lst)

count=0
for item in lst:
    count+=1
    resp=requests.get(item,headers=headers)
    with open('video/'+str(count)+'.mp4','wb') as file:
        file.write(resp.content)
print('视频下载完毕')

五、pyquery解析数据

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好
前提条件:
你对CSS选择器与JQuery有所了解

非Python标准模块,需要安装
安装方式
pip3 install pyquery
测试方式
Import pyquery

1.第一种创建方式

from  pyquery import  PyQuery as py
html='''
    <html>
        <head>
            <title>PyQuery</title>
        </head>
        <body>
            <h1>PyQuery</h1>
        </body>
    </html>
'''
doc=py(html)  #创建PyQuery的对象,实际上就是在进行一个类型转换,将str类型转成PyQuery类型
print(doc)
print(type(doc))
print(type(html))
print(doc('title'))

run:

<html>
        <head>
            <title>PyQuery</title>
        </head>
        <body>
            <h1>PyQuery</h1>
        </body>
    </html>
<class 'pyquery.pyquery.PyQuery'>
<class 'str'>
<title>PyQuery</title>

2.第二种创建方式

from  pyquery import  PyQuery
doc=PyQuery(url='http://www.baidu.com',encoding='utf-8')
print(doc('title'))

run:

<title>百度一下,你就知道</title>

3.第三种创建方式

from  pyquery import  PyQuery
doc=PyQuery(filename='demo.html')
print(doc)
print(doc('h1'))

run:

<html>
        <head>
            <title>PyQuery</title>
        </head>
        <body>
            <h1>PyQuery</h1>
        </body>
 </html>
<h1>PyQuery</h1>

六、pyquery的使用

在这里插入图片描述

from  pyquery import  PyQuery
html='''
    <html>
        <head>
            <title>PyQuery</title>
        </head>
        <body>
            <div id="main">
                <a href="http://www.baidu.com">小周周</a.txt>
                <h1>欢迎来到异世界</h1>
                我是div中的文本
            </div>
            <h2>Python学习</h2>
        </body>
    </html>
'''
doc=PyQuery(html)
#获取当前节点
print(doc("#main"))

#获取父节点,子节点,兄弟节点
print('-----------父节点----------------')
print(doc("#main").parent())
print('-----------子节点----------------')
print(doc("#main").children())
print('-------------兄弟节点------------------')
print(doc("#main").siblings())

print('------------------获取属性---------------')
print(doc('a').attr('href'))

print('------------获取标签的内容----------------')
print(doc("#main").html())
print('-------------------------')
print(doc("#main").text())

run:

<div id="main">
                <a href="http://www.baidu.com">小周周
                <h1>欢迎来到异世界</h1>
                我是div中的文本
            </a></div>
            
-----------父节点----------------
<body>
            <div id="main">
                <a href="http://www.baidu.com">小周周
                <h1>欢迎来到异世界</h1>
                我是div中的文本
            </a></div>
            <h2>Python学习</h2>
        </body>
    
-----------子节点----------------
<a href="http://www.baidu.com">小周周
                <h1>欢迎来到异世界</h1>
                我是div中的文本
            </a>
-------------兄弟节点------------------
<h2>Python学习</h2>
        
------------------获取属性---------------
http://www.baidu.com
------------获取标签的内容----------------

                <a href="http://www.baidu.com">小周周
                <h1>欢迎来到异世界</h1>
                我是div中的文本
            </a>
-------------------------
小周周
欢迎来到异世界
我是div中的文本


总结

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小唁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值