当前位置: 首页 > article >正文

python爬虫解析器bs4,xpath,pquery

0x00 bs4

解析器的作用就是可以直接解析html页面,可以直接从网页中提取标签中的内容,而不用在使用正则表达式进行提起数据

import requests
from bs4 import BeautifulSoup
html_content = '''
<li id='123'><a href='dfsdf'>123</a>789</li>
<li id='55'><a href='f'>456</a>888</li>
'''
# 解析HTML
soup = BeautifulSoup(html_content, 'html.parser')  
li=soup.find_all('li')  #查找所用的li标签
print(li[0].text)       #把第一个li标签中内容读取出来
a=li[0].find("a")       #在第一个li标签中查找a标签
print(a.text)           
print(a.get("href"))   #在读取a标签href的属性值



li=soup.find('li',{"id":"123"})  #查找id为123的li标签
for i in li:
    print(i.text)

在这里插入图片描述
在这里插入图片描述
案列爬取图片
https://haowallpaper.com/
在这里插入图片描述

import requests
from bs4 import BeautifulSoup
url='https://haowallpaper.com/'
html_content=requests.get(url).text
html=BeautifulSoup(html_content,"html.parser")
div=html.find_all("div",{"class":"card"})
n=1
for a_list in div:
    src=a_list.find("img")
    src=src.get("src")
    rep=requests.get(src)
    with open(f"{n}.jpg",'wb+') as f:
        f.write(rep.content)   #要用content而不是text文本
        n+=1

0x01 xpath

案列爬取什么值得买手机价格和手机型号,当源码过多时可以把源码下载下来,删除无用代码然后在进行分析
在这里插入图片描述

import requests
from lxml import etree
from PIL import Image, ImageDraw, ImageFont
headers={"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"}
url='https://www.smzdm.com/fenlei/zhinengshouji/'
req=requests.get(url)
html=etree.HTML(req.content)
price_list=html.xpath('//a[@class="z-highlight "]/text()')
title_list=html.xpath('//h5[@class="feed-block-title"]/a[1]/text()')
# a_list=html.xpath("//div[@class='z-feed-img']//img/@src")
count=0
for i in price_list:
   count+=1
with open("3.txt","a+",encoding='gbk') as f:
    for i in range(0,count):
        f.write(price_list[i].strip())
        f.write(title_list[i].strip()+'\n')

在这里插入图片描述

0x02 PyQuery

1.PyQuery基础使用

from pyquery import   PyQuery
html='''
<div class='aaa'><a href='www.123.com'>aaa</a>aaa1</div>
<div class='bbb'><a href='www.456.com'>bbb</a>bbb1</div>
<div class='ccc' id='cc'><a href='www.789.com'>ccc</a>ccc1</div>
'''
p=PyQuery(html)
#a=p("div a")和a=p("div")("a")是一样的
div1=p("div") #选取所有的div标签
div=p("div .aaa") #选取div的class属性值为aaa的div标签
div2=p("div #cc") #选取div的id值为cc的div标签
print("-------")
print(div)
print("-------")
print(div2)
print("-------")
a=p("div a").attr("href") #提取div标签下的a标签的href属性值,只会提取一个href值
print(a)
a1=p("div a").items()#一个包含所有a标签的迭代器,有很多内容时可以这样提取
for a2 in a1:
    href=a2.attr("href")
    text=a2.text() #获取a标签中的文本
    print(href)
    print(text)

在这里插入图片描述
修改html页面代码

from pyquery import   PyQuery
html='''
<div class='aaa'><a href='www.123.com'>aaa</a>aaa1</div>
<div class='bbb'><a href='www.456.com'>bbb</a>bbb1</div>
<div class='ccc' id='cc'><a href='www.789.com'>ccc</a>ccc1</div>
'''
p=PyQuery(html)
p("div .aaa").after("<div>qqq</div>") #在第一个div后加一个div标签
p("div .aaa").append("<div>aaa</div>") #在第一个div里面加一个div标签
p("div .aaa").attr("id","111")#在第一个div加一个属性id为111
p("div .aaa").remove()#删除第一个div
p("div .aaa").remove_attr("id")#删除第一个div的id


2.案列豆瓣读书爬取短评,书评,评分,书名,内容,作者简介
在这里插入图片描述
注意这里热门短评是会刷新的,只读取5条,每次读取的都有不一样的地方
在这里插入图片描述

import requests
from pyquery import PyQuery
headers={"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"}
url='https://book.douban.com/subject/4913064/'
rep=requests.get(url,headers=headers)
p=PyQuery(rep.text)
with open("1.txt",'a+',encoding='utf-8') as f:
    title=p("title").text()
    score=p("div #interest_sectl div div strong").text()
    f.write(f"书名:{title}\n评分{score}\n")
    content=p("div .intro").eq(0)("p").text() #选择第一个class为intro的div下所有的p标签
    composer=p("div .intro").eq(1)("p").text()#选择第二个class为intro的div下所有的p标签
    f.write(f"内容简介:{content}\n作者简介:{composer}")
    comments=p("li p span ").items()
    f.write("\n短评:\n")
    for i in comments:
        comment=i.text()
        f.write(f"{comment}\n")
    shupin_1=p("div.main-bd ").items()
    f.write("书评:\n")
    for j in shupin_1:
        shupin_2=j("h2 a").text()
        shupin_3=j("div div .short-content").text().replace("这篇书评可能有关键情节透露","").replace("...  (展开)","")
        f.write(f"{shupin_2+shupin_3}\n")

在这里插入图片描述


http://www.kler.cn/a/595445.html

相关文章:

  • 【如何打包docker大镜像】
  • 鸿蒙NEXT项目实战-百得知识库03
  • docker安装向量数据库Milvus及可视化工具 Attu
  • 复习HCIA
  • ngx_http_add_listen
  • 在R中读入h5ad文件,并转换为seurat对象
  • 闻所闻尽:穿透声音的寂静,照见生命的本真
  • 一文讲清 C++ CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)
  • 基于Nvidia Jetson Nano边缘计算设备使用TensorRT部署YOLOv8模型实现目标检测推理
  • CHM(ConcurrentHashMap)中的 sizeCtl 的作用与值变化详解
  • 批量删除 PPT 空白幻灯片页面
  • 车载以太网网络测试-20【传输层-DOIP协议-3】
  • C语言复习笔记--数组
  • IPD的分析工具与模型(十一)利用Ansoff矩阵制定产品市场组合,帮助企业确定增
  • 通过《电幻国度》来看机器人的发展
  • OpenCV旋转估计(2)用于自动检测波浪校正类型的函数autoDetectWaveCorrectKind()
  • B2-DPO:开启去中心化物联网(DePIN)的智能革命
  • Python之使用mitmproxy进行本地化网络监听
  • KNN算法
  • python中的元组、字典与集合