第二章 爬虫数据解析

文章目录

  • 1. 数据解析方式
  • 2. 正则表达式
    • 1. 正则表达式使用的网站:
    • 2. 常用的元字符
    • 3. 贪婪匹配
    • 4. re模块的使用
  • 3. BeautifulSoup数据提取
  • 4. xpath提
    • 代码
  • 5. PyQuery解析
    • pyquery数据解析
    • pyquery修改页面数据

1. 数据解析方式

  1. re解析
  2. bs4解析
  3. xpath解析
  4. pyquery解析

2. 正则表达式

优点: 速度快,效率高,准确性高正则的

缺点: 新手上手难度有点儿高

1. 正则表达式使用的网站:

     https://www.mklab.cn/utils/regex

     https://tool.oschina.net/regex/

2. 常用的元字符

. 匹配除换行符以外的任意字符, 未来在python的re模块中是一个坑

\w匹配字母或数字或下划线

\s 匹配任意的空白符

\d 匹配数字

\n 匹配一个换行符

\t 匹配一个制表符

^ 匹配字符串的开始

$ 匹配字符串的结尾

\W 匹配非字母或数字或下划线

\D 匹配非数字

\S 匹配非空白符

alb 匹配字符a或字符b

() 匹配括号内的表达式,也表示一个组

[…] 匹配字符组中的字符

[^…]匹配除了字符组中字符的所有字符

3. 贪婪匹配

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

  • 贪婪匹配

.* 尽可能多的匹配

  • 惰性匹配

    .*? 尽可能少的匹配 ->回溯

.*?<\div>

4. re模块的使用

  1. 常用模块的使用
import re

# findall直接返回匹配结果,以列表形式返回
res = re.findall(r"\d+","我今年28岁了,我有100万")
print(res)

# 迭代器
res1 = re.finditer(r"\d+","我今年28岁了,我有100万")
for item in res1:    #从迭代器中拿到内容
    print(item.group())   #从匹配结果中拿到数据

# 只能匹配到第一次匹配的内容
res2 = re.search(r"\d+","我今年28岁了,我有100万")
print(res2.group())

#从开头开始匹配
res3 = re.match(r"\d+","我今年28岁了,我有100万")
print(res3)

#预加载,提前把正则对象加载完毕
obj = re.compile(r"\d+")
#使用加载好的正则
res4 = obj.findall("我有100元,借给你50元")
print(res4)

  1. 爬虫数据提取使用
  #单独匹配字符串的内容,用()可以单独取名字
  #匹配内容分组 ?p  .group(id)
  
  obj = re.compile(r"(?P.*?)")
  res = obj.finditer(s)
  for item in res:
      print(item.group("id"))
  1. 豆瓣top250的爬取&保存
import re
from openpyxl import Workbook
import requests

lst = []
for i in range(10):
    url = f"https://movie.douban.com/top250?start={i*25}&filter="
    heads = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
        }
    resp = requests.get(url=url,headers=heads)
    pageSource = resp.text

    obj = re.compile(r'
.*?(?P.*?)' r'.*?导演: (?P.*?) .*?' r'
.*?(?P.*?) .*?'
r'property="v:average">(?P.*?).*?' r'(?P.*?)评价',re.S) res = obj.finditer(pageSource) for item in res: ls = [item.group('move_name'), item.group('director'), item.group('year').strip(), item.group('score'),item.group('person_number')] lst.append(ls) wb = Workbook() ws = wb.active head = ["电影名","导演","拍摄年份","电影评分","评价人数"] ws.append(head) for i in lst: ws.append(i) wb.save('豆瓣top250.xlsx')

如果数据存在多层,可以分段爬取

3. BeautifulSoup数据提取

from bs4 import BeautifulSoup

html = """

"""
# 初始化BeautifulSoup
page = BeautifulSoup(html,"html.parser")

#获取标签
li = page.find("li",attrs={"id":"100"})
print(li)
#获取标签的之
print(li.text)

#获取标签属性
herf = li.find("a").get("herf")
print(herf)

4. xpath提

代码

from lxml inport etree

from lxml import import html
etree = html.etree

'''
//text() 提取标签下所有的文本

./ 当前目录下

./[@class="*"]/ 获取class属性为\*的标签下的数据

./a[1] 获取当前目录下第一个a标签
'''

5. PyQuery解析

pip install pyquery

pyquery数据解析

from pyquery import PyQuery

p = PyQuery(html)

# 链式操作
# 提取div中的li
a = p("div")("li")
a = p("li a")

#1. 根据class属性筛选
a = p(".属性 a")

#2. 根据id筛选
a = p("#aaa a")

#3. 提取数据中的属性
h = p("").attr("属性")

#4. 提取数据
t = p("").text()

#5. 拿到标签下所有的标签
it = p("").items()
for i in it:
    print(i.attr(),i.text())
    

pyquery修改页面数据

# 1. 在xx标签后面添加新标签
p = PyQuery(html)

p("div.aaa").after(PyQuery"""""")


# 2. 在标签里面添加
p("div.aaa").append("""""")

# 3. 修改标签属性
p("div.aaa").attr("class","xx")

# 4. 新增属性
p("div.aaa").attr("class","xx")

# 5. 删除属性
p("div.aaa").remove_attr("id")

# 6. 删除标签
p("div.aaa").remove()

#获取div下第一个dl标签的d标签,的第一个d标签的之
p("div>dl:nth-child(1)>d").eq(0).text()

str.replace("old","new")

#判断div的dl下是否包含xx
 p(""div>dl:contains("包含的内容")")

   



你可能感兴趣的:(爬虫,爬虫,python,开发语言)