首页 > 其他分享 >数据解析

数据解析

时间:2023-05-19 13:45:04浏览次数:29  
标签:匹配 text item html result print 解析 数据

正则

元字符

元字符:具有固定含义的特殊符号
常用元字符:
    .   匹配除换行符以外的任意字符,未来在Python的re模块是个坑
    \w  匹配字母或数字或下划线
    \d  匹配数字
    \n	匹配一个换行符
    \t	匹配一个制表符
    
    ^	匹配字符串的开始
    $	匹配字符串的结尾
    
    \W	匹配非字母或数字或下划线
    \D	匹配非数字
    \S	匹配非空白符
    a|b	匹配字符a或字符b
    ()	匹配括号内的表达式,
    [...]	匹配字符组中的字符
    [^...]	匹配除了字符组中的字符的所有字符

量词

*	重复零次或更多次
+	重复一次或更多次
?	重复零次或一次
{n}		重复n次
{n,}	重复n次或更多次
{n,m}	重复n次到m次

贪婪匹配和惰性匹配

.*		贪婪匹配
.*?		惰性匹配

re模块

# re模块是Python自带的模块
import re

# findall 找出所有
result = re.findall("a", "abcdefghij")
print(result)

result = re.findall(r"\d+", "我是一个1234哈324")
print(result)


# finditer()    重点,多多练习
result = re.finditer(r"\d+", "我今年18岁,我有20000元")
for item in result:     # 从迭代器中拿到内容
    print(item.group())     # 从匹配的结果中拿到数据
print(result)


# search只会匹配到第一次匹配的内容
result = re.search(r"\d+", "我叫周杰伦,我今年32岁,5年4班")
print(result.group())


# match,在匹配的时候,是从字符串的开头进行匹配的,类似在正则前面加上了^
result = re.match(r"\d+", "我叫周杰伦,我今年32岁,5年4班")
print(result)


# compile() 预加载,提前把正则对象加载完毕
obj = re.compile(r"\d+")
# 直接把加载好的正则进行使用
result = obj.findall("我叫周杰伦,今年44岁,3年2班")
print(result)

import re
s = """
<div class='西游记'><span id='10010'>中国联通</span></div>
<div class='西游记'><span id='10086'>中国移动</span></div>
"""

# 想要提取数据必须用小括号括起来,可以单独起名字
# (?P<名字>正则)
# 提取数据的时候,需要group("名字")
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span>")

result = obj.finditer(s)
for item in result:
    id = item.group("id")
    print(id)
    name = item.group("name")
    print(name)

bs4

# pip install bs4 安装bs4模块
from bs4 import BeautitfulSoup

html = """
<div class="container">
        <h1 class="test">
            <a href="t" id="home-link">我的小站-阿里云盘资源共享站</a>
        </h1>
        <h1 class="test">
            <a href="ts" id="home-link">我的小站-</a>
        </h1>
        <h1 class="test">
            <a href="tss" id="home-link">-阿里云盘资源共享站</a>
        </h1>
        <a></a>
        <div id="header-primary" class="Header-primary"></div>
        <div id="header-secondary" class="Header-secondary"></div>
</div>
"""
# 1.初始化BeautifulSoup对象
page = BeautifulSoup(html, "html.parser")

# 2. find()查找到一个  findAll()查找到所有的
h1 = page.find("h1", attrs={"class":"test"})
a = h1.find("a")
print(a.text)   # 拿标签内的文本
print(a.get("href"))    # 拿属性.get("属性名")


案例 1 提取文字

import requests
from bs4 import BeautifulSoup

for i in range(0, 401):
    url = "http://2bhsck.cc/vodtype/1-"+str(i)+".html"
    resp = requests.get(url)
    html = resp.text

    page = BeautifulSoup(html, "html.parser")

    h4 = page.findAll("h4", attrs={"class": "title"})
    open("hsck.scv", mode="a", encoding="utf-8").write(f"--------------第{i}页---------------\n")
    for item in h4:
        a = item.find("a").text
        open("hsck.scv", mode="a", encoding="utf-8").write(f"{a}\n")
    print(f"第{i}页 完成")

案例 2 图片提取

import requests
from bs4 import BeautifulSoup

url = "http://www.umeituku.com/bizhitupian/meinvbizhi/"

resp = requests.get(url)
resp.encoding = "utf-8"

n=1

main_page = BeautifulSoup(resp.text, "html.parser")
min_page = main_page.findAll("a", attrs={"class": "TypeBigPics"})
for item in min_page:
    href = item.get("href")
    resp2 = requests.get(href)
    resp2.encoding = "utf-8"
    child_page = BeautifulSoup(resp2.text, "html.parser")
    img = child_page.find("div", attrs={"class": "ImageBody"})
    img_src = img.find("img").get("src")
    img_resp = requests.get(img_src)
    print(img_src)
    with open(f"12_图片提取/{n}.jpg", mode="wb") as f:
        f.write(img_resp.content)
    n+=1


xpath 解析

# pip install lxml
from lxml import etree

# 如果报错,可以考虑这种写法
# from lxml import html
# etree = html.etree

xml = """
    <book>
        <id>111</id>
        <name>Lorem, ipsum.</name>
        <sprice>1.23</sprice>
        <nick>臭豆腐</nick>
        <author>
            <nick id="10085">大飞</nick>
            <nick id="111">小飞</nick>
            <nick id="jay">周杰伦</nick>
        </author>
        <div>
            <nick>Lorem.</nick>
        </div>
        <partner>
            <nick id="ppc">Lorem, ipsum dolor.</nick>
            <nick id="pcc">Lorem ipsum dolor sit.
            </nick>
        </partner>
    </book>
"""


# 此时练习只能用XMLxml
et = etree.XML(xml)

# / 表示在根节点
result = et.xpath("/book")

# 在xpath中间的/表示的是儿子
result = et.xpath("/book/name")

# text() 拿文本
result = et.xpath("/book/name/text()")[0]

# // 表示的是子孙后代
result = et.xpath("/book//nick")

# * 通配符
result = et.xpath("/book/*/nick/text()")

# []表示属性筛选,@属性名=值
result = et.xpath("/book/author/nick[@class='jay']/text()")

# 拿到id的值
result = et.xpath("/book/partner/nick/@id")
print(result)
from lxml import etree
import requests

html = "https://zhengzhou.zbj.com/search/service/?l=0&kw=%E6%95%B0%E6%8D%AE%E6%8A%93%E5%8F%96&r=2"
resp = requests.get(html)

et = etree.HTML(resp.text)

# 价格
jxge = et.xpath("//div[@class='price']/span/text()")

# 业务
yewu = et.xpath("//div[@class='name-pic-box']/a/text()")

# 公司名称
gssi = et.xpath("//div[@class='shop-info text-overflow-line']/text()")

for item in range(len(jxge)):
    print(f"业务:{yewu[item]}\n价格:{jxge[item]} \n公司:{gssi[item]}")
    print("")

pyquery

# pip install pyquery
from pyquery import PyQuery
import requests


def get_page_source(url):
    resp = requests.get(url)
    resp.encoding = "utf-8"
    return resp.text


def parser_page_source(html):
    doc = PyQuery(html)
    user = doc("article>aside>header>div>h2>a").items()
    time = doc("article>aside>section>div>div>p:nth-child(1)").items()
    for item in time:
        print(item.text())

def main():
    url = "https://www.dongchedi.com/auto/series/score/4363-x-x-x-x-x"
    html = get_page_source(url)
    parser_page_source(html)


if __name__ == '__main__':
    main()

标签:匹配,text,item,html,result,print,解析,数据
From: https://www.cnblogs.com/sroot/p/17414870.html

相关文章

  • pymsql操作数据库
    以下是常用的一些pymysql操作数据库的操作。为了打包后方便读取与写入不同数据库,留出了更改数据库的接口。接口文件类似于:localhostrootxxxxxxtest3306utf8importpymysqlimporttime#读取外部配置withopen('database_config_test.txt','r')asf:item=f.readl......
  • [转]Android冷启动白屏解析,带你一步步分析和解决问题
    [img]http://dl2.iteye.com/upload/attachment/0118/3095/d8d8c13d-7225-33cd-9559-efcc6e1f9432.png[/img]关于首次启动程序白屏时间过长这个问题其实我也早就发现了,而且正如评论中所说,有的时候白屏时间可以长达七八秒。看来这个问题已经是一个普遍存在的......
  • MagicEXIF(元数据编辑器)Win激活旗舰版中文安装教程下载和介绍
    寻找一款好用的MagicEXIF软件可谓是一场漫长的旅程。在搜索引擎中找到的许多下载网站提供的MagicEXIF软件基本都是假的,带有各种广告捆绑软件,让人感到十分沮丧。此外,有些下载版本也无法激活或注册。不过今天小编为大家提供的这个MagicEXIF(元数据编辑器)win激活版本经过测试已完美安......
  • Android Fragment完全解析,关于碎片你所需知道的一切
    我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述。但是Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了,因为平板的屏幕非常大,手机的界面放在平板上可能会有......
  • 使用MASA Stack+.Net 从零开始搭建IoT平台 第四章 4.2使用时序库存储上行数据
    目录前言分析实施步骤时序库的安装解决playload没有时间戳问题代码编写测试总结前言我们可以将设备上行数据存储到关系型数据库中,我们需要两张带有时间戳的表(最新数据表和历史数据表),历史数据表存储所有设备上报的数据,最新数据表需要存储设备最新一条上报数据,这条最新数据相当......
  • 数据库的恢复技术
    存储器结构分类1、易失性存储器:内存、高速缓冲存储器2、非易失性存储器:磁盘、磁带3、稳定存储器:理想的存储器,其中信息永不丢失稳定存储器的实现要实现稳定存储器,就要在多个非易失性存储介质上以独立的故障模式复制所需要的信息,并且以某种受控的方式更新数据,以保证数据传送的......
  • awk在数据列中添加:分隔符号
    awk在数据列中添加:分隔符号最近在玩长亭科技免费的雷池WAF,其更新速度较快,然而每次dockerhub上拉数据的时候总是不能获取到最新的latest版本,每次都得带版本号来拉,并通过修改tag方式改名为latest,我又是一个强迫症,每次都要取消带版本号的标签,手动取消还得一个一个弄,就想要用awk......
  • 近8万条谜语灯谜大全ACCESS\EXCEL数据库
    其实互联网上关于谜语和灯谜的资料仍然是挺多的,但是要想数据量以万来计算并且是接近10万的量来看的话,就只能是《近8万条谜语灯谜大全ACCESS数据库》了。而且《近8万条谜语灯谜大全ACCESS数据库》的数据表字段中也包含分类字段,可以根据分类字段有针对性的给出谜语。分类情况包含:......
  • 2万5千多条经典名言语录ACCESS\EXCEL数据库
    语录之类的数据库之前也发现过几个,比如《用自制的采集程序采集的经典语录》、《从网上采集下来的那些优美的句子》等,但是这些感觉都比较现代,比较时尚,而今天发现的这个《2万5千多条经典名言语录ACCESS数据库》则比较正规、是属于那种收集完整的传统经典谚语类的ACCESS数据库。---......
  • 技术干货|如何利用 ChunJun 实现数据离线同步?
    ChunJun是⼀款稳定、易⽤、⾼效、批流⼀体的数据集成框架,基于计算引擎Flink实现多种异构数据源之间的数据同步与计算。ChunJun可以把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从⽽为企业提供全⾯的数据共享,目前已在上千家公司部署且稳定运⾏。在之前,我们曾......