爬虫学习二(数据解析)

Re解析(正则表达式):

  • 常用元字符

re模块:

  • re.findall(正则表达式,原始字符串)
    • 匹配字符串中所有符合正则的内容,返回列表
      import re
      s=re.findall(r"\d",'12erfc456gffg7')
      print(s)
      ['1', '2', '4', '5', '6', '7']

 

  • re.finditer(正则表达式,原始字符串或网页源代码(response))
    • 匹配字符串中所以内容,返回迭代器,可以使用for循环访问其中内容,从迭代器中提取内容需要  .group()
    • import re
      s=re.finditer(r"\d",'12erfc456gffg7')
      for i in s:
          print(i.group())
      1
      2
      4
      5
      6
      7

 

  • re.search(正则表达式,原始字符串)
    • 匹配字符串中匹配内容,返回match对象,需要用.group()提取内容,检索到一个结果就返回
    • 全文匹配
      import re
      s=re.search(r"\d",'12erfc456gffg7')
      print(s.group())
      1

 

  • re.match(正则表达式,原始字符串)
    • 匹配字符串中匹配内容,返回match对象,需要用.group()提取内容,检索到一个结果就返回
    • 从头匹配,开始没有响应数据就匹配失败
    • import re
      s=re.match(r"\d",'12erfc456gffg7')
      print(s.group())
      1
      
      
      import re
      s=re.match(r"\d",'rfc456gffg7')
      print(s.group())
      Traceback (most recent call last):
        File "E:/爬虫/p0.py", line 4, in <module>
          print(s.group())
      AttributeError: 'NoneType' object has no attribute 'group'

 

  • re.compile(正则表达式,re.S)
    • 预加载正则表达式:在程序最开始就定义正则表达式,方便后面的使用,re.S的作用是让.能匹配换行符
    • (?P<字段名>正则表达式)可以进一步匹配内容并存入字段
    • .*?可以过滤前后表达式之间的部分,通常是多行中不同的部分,(?P<字段名>.*?)可以将需要的数据存入设置的字段名的列表中,这时使用group(字段名)可以提取字段内容
    •  

      import re
      obj=re.compile(r'\d+')
      s=obj.findall('rfc456gffg7')
      print(s)
      ['456', '7']
      

       

    •  

  • requests.get(网页源代码,verify=False)
    • 请求网页源代码
  • response.encoding='编码类型'可以设置字符集的编码方式防止乱码
    • response.encoding='utf-8'

 

实战:

  • 爬取豆瓣电影top250的电影名字、年份、评分、评论人数
  • #-*- codingn:utf-8 -*-
    #获取网页源代码 request()
    #获取响应字段 正则表达式 re
    import re
    import requests
    import csv
    
    f = open("data.csv", mode='w', encoding='utf-8')
    csvwriter = csv.writer(f)
    url=[]
    for i in range(0,100,25):
        url.append('https://movie.douban.com/top250?start=%d'%i)
    headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
    
    for i in url:
        resp=requests.get(i,headers=headers)
        resp.encoding='utf-8'
    #print(resp.text)
        obj=re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?'
                      r'<p class="">.*?<br>(?P<year>.*?)&nbsp.*?<span '
                      r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
                      r'<span>(?P<comment>.*?)人评价</span>',re.S)
        list=obj.finditer(resp.text)
        for i in list:
            print(i.group('name'))
            print(i.group('score'))
            print(i.group('year').strip())
            print(i.group('comment'))
            dic=i.groupdict()
            dic['year']=dic['year'].strip()
            csvwriter.writerow(dic.values())
    f.close()
    print("over")

 

 

Xpath解析

  • XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。
  • 使用时需导入,from lxml import etree,tree=etree.parse('html(即网页)'),tree.path(Xpath解析式),返回列表
  • 取节点内容可\text()拿文本,例如book\name\a\text(),取book标签里的name标签里的a标签里的内容
  • 注意xpath索引从1开始
  • 可通过网页抓包工具的elements选中需要的内容右键copy它的xpath
  • 利用etree.HTML(网页源代码)将代码转为html
  • a.html:
    <html lang='en'>:
        <head>:
            <meta charset="utf-8" />
        </head>
        <body>:
            <ul>:
                <li><a href="hhhhhhhhh">百度</a></li>
                <li><a href="xxxxxxxxx">谷歌</a></li>
            </ul>
        </body>
    </html>
    
    
    
    from lxml import etree
    tree=etree.parse('a.html')
    提取‘百度’、‘谷歌’:
    result=tree.xpath('\html\body\ul\li\a\text()')
    
    提取’百度‘:
    result=tree.xpath('\html\body\ul\li[1]\a\text()')
                     
    提取href为’hhhhhhhhhh'的数据:
    result=tree.xpath('\html\body\ul\li[1]\a[@href='hhhhhhhh']\text())
                    
    获取全部a标签的href属性值:
    result=tree.xpath('\html\body\ul\li[1]\a\@href)
    
                     
    获取li列表并遍历:
    li_list=tree.xpath('\html\body\ul\li')
    for li in li_list:
        print(i)                 #节点
        li.xpath("./a/text()")         #在li_list中继续查找文字,相对查找加./,./表示当前节点,返回['百度'],['谷歌']
        li.xpath("./a/@href")          #获取a标签中href的值(获取属性值),返回['hhhhhhhhh'],['百度'],['xxxxxxxxx'],['谷歌']
  • bookstore/*/nick/text()表示bookstore节点下任意节点的nick的内容,*表示任意节点

 

  • 实例:
    • #-*- codingn:utf-8 -*-
      #获取网页源代码 request()
      #xpath提取
      import requests
      from lxml import etree
      url = "https://www.nowcoder.com/interview/ai/index"
      response = requests.get(url= url)
      response.encoding='utf-8'
      wb_data = response.text
      html = etree.HTML(wb_data)
      companys = html.xpath('//html/body/div/div[3]/div/div[3]/div[2]/div/div')
      name=[]
      job=[]
      attention=[]
      for company in companys:
          name.append(company.xpath('.//div[1]/div[2]/text()'))
          job.append(company.xpath('.//div[2]/span[1]/b/text()'))
          attention.append(company.xpath('.//div[2]/span[2]/b/text()'))
      interviews=zip(name,job,attention)
      for i in interviews:
          print(i)
      

       

    • 注意!!!!
    • 如果在网页源代码里面没有响应的内容就不能通过网络抓包工具copy字段的xpath进行提取,否则会返回空列表
posted @   肥余  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示