开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 40275|回复: 4
收起左侧

[源码分享] Python的html解析 自定义规则版

[复制链接]
结帖率:50% (1/2)
发表于 2021-4-25 15:38:40 | 显示全部楼层 |阅读模式   四川省成都市
本帖最后由 不吃鱼的喵 于 2021-4-26 05:44 编辑

如有啥建议可以提一下哈


import requests
import re
from bs4 import BeautifulSoup
from bs4.element import Tag
from ua import *
from mpy.YiChang import *

"""部分功能可扩展"""


def 网页_读网址(地址, ua='电脑'):
    """
    简单的网页读写
    """
    try:
        html = requests.get(地址, headers=取随机UA(ua))
        html.encoding = html.apparent_encoding
        return html.text
    except:
        print('网页_读网址 异常')
        return None


def __html路径匹配(源码, 路径):
    """
    使用的第三方bs4的库  也可以换成其他的 或者自己造轮子
    """
    try:
        路径列表 = 路径.split('>')
        匹配列表 = [源码]
        for 匹配路径 in 路径列表:
            临时列表 = []
            for 文本 in 匹配列表:
                临时 = 匹配路径.split('.')
                路径 = 临时[0]
                索引 = -1
                if len(临时) > 1:
                    索引 = int(临时[1])
                数据 = BeautifulSoup(str(文本), 'html.parser')
                数据 = 数据.select(路径)
                if 索引>-1:           # 匹配的到的索引 而不是整个路径树
                    临时列表.append(数据[索引])
                for j in range(len(数据)):
                    临时列表.append(数据[j])
            匹配列表 = 临时列表
        return 匹配列表
    except:
        print('html取路径 异常')
        return []


def __html取属性(元素: Tag, 属性名):
    """
    依赖BS4库
    """
    try:
        if 属性名 == 'text':
            临时 = 元素.text
        elif 属性名 == 'string':
            临时 = 元素.string
        elif 属性名 == 'str':
            临时 = str(元素)
        else:
            临时 = 元素.get(属性名)
        if 临时 is None:
            临时 = ''
        return 临时
    except:
        print('html取属性 异常')


def __html正则处理(文本, 参数):
    """
    参数列表:
    第一个是判断类型
    第二个是正则的表达式
    第三个就是正则的参数  如正则替换被替换的文本  正则匹配用不到
    """
    try:

        if 参数[0] == '正则匹配':
            if 参数[2] == '':
                索引 = 0
            else:
                索引 = int(参数[2])
            结果 = re.search(参数[1], 文本)
            if 结果:
                文本 = 结果.group(索引)
        elif 参数[0] == '正则替换':
            文本 = re.sub(参数[1], 参数[2], 文本)
        return 文本
    except:
        print('html正则处理 异常')


def __html文本处理(文本, 参数):
    """
    一些非正则的文本处理
    """
    try:
        if 参数[0] == '前置文本':
            文本 = 参数[1] + 文本
        elif 参数[0] == '后置文本':
            文本 = 文本 + 参数[1]
        elif 参数[0] == '删隐藏字符':
            文本 = 参数[1].join(文本.split())
        return 文本
    except:
        return None


def __html访问地址(地址, 参数):
    """
    第二次或第n次读取网页并获得源码
    构思中......
    """
    pass


@异常检测
def html解析(网页源码, 匹配规则: str):
    规则列表 = 匹配规则.split('|')
    匹配列表 = [网页源码]
    for 规则 in 规则列表:
        临时列表 = []
        for 文本 in 匹配列表:
            临时 = 规则.split('@')
            临时文本 = ''
            if '路径' == 临时[0]:  # HTML取路径
                临时列表 = 临时列表 + __html路径匹配(文本, 临时[1])
                continue
            elif '属性' == 临时[0] and type(文本) == Tag and len(临时) == 2:
                临时文本 = __html取属性(文本, 临时[1])
            elif 临时[0].find('正则') > -1:  # 正则处理
                临时文本 = __html正则处理(str(文本), 临时)
            else:
                临时文本 = __html文本处理(str(文本), 临时)
            if 临时文本:
                临时列表.append(临时文本)
        else:
            匹配列表 = 临时列表

    return 匹配列表
结帖率:50% (1/2)
 楼主| 发表于 2021-4-25 15:45:40 | 显示全部楼层   四川省成都市
本帖最后由 不吃鱼的喵 于 2021-4-25 16:56 编辑

全局书源 = {'笔趣阁':
            {"搜索地址": "http://www.xbiquge.la/modules/article/waps.php?searchkey={}",
             "搜索书名": "路径@table[class=\"grid\"]>tr>td[class=\"even\"].0>a|属性@text",
             "搜索书籍地址": "路径@table[class=\"grid\"]>tr>td[class=\"even\"].0>a|属性@href",
             "搜索作者": '路径@table[class="grid"]>tr>td[class="even"].1|属性@text',
             "搜索最新章节": '路径@table[class="grid"]>tr>td[class="odd"]>a|属性@text',

             "章节名": "路径@div[id=\"list\"]>dl>dd>a|属性@text",
             "章节地址": "路径@div[id=\"list\"]>dl>dd>a|属性@href|前置文本@http://www.xbiquge.la",
             "章节正文": "路径@div[id=\"content\"]|属性@text|删隐藏字符@\n\n    ",
             "封面": "路径@div[id=\"fmimg\"]>img|属性@src",
             "作者": "路径@div[id=\"info\"]>p.0|属性@text|删隐藏字符@|正则替换@作者:@",
             "最后更新": "路径@div[id=\"info\"]>p.2|属性@text|正则替换@最后更新:@",
             "最新章节": "路径@div[id=\"info\"]>p.3>a|属性@text",
             "简介": "路径@div[id=\"intro\"]>p.1|属性@text|删隐藏字符@ "}}

全局书源['xddxs'] = {
    '搜索地址': 'https://m.xddxs.cc/s.php?q={}',
    '搜索书名': '路径@h4[class="bookname"]>a|属性@text',
    '搜索作者': '路径@div[class="bookinfo"]>div[class="author"]|属性@text|正则替换@作者:@',
    '搜索书籍地址': '路径@h4[class="bookname"]>a|属性@href|前置文本@https://m.xddxs.cc',
    '搜索封面': '路径@div[class="bookimg"]>a>img|属性@src',
    '搜索类型': '路径@div[class="bookinfo"]>div[class="cat"]|属性@text|正则替换@分类:@',
    '搜索最新章节': '路径@div[class="update"]>a|属性@text',
}

最近在写小说的匹配

QQ截图20210425164112.png
回复 支持 反对

使用道具 举报

结帖率:98% (79/81)

签到天数: 7 天

发表于 2021-5-2 04:42:57 高大上手机用户 | 显示全部楼层   江西省抚州市
好,支持支持
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
 楼主| 发表于 2021-4-25 16:41:47 | 显示全部楼层   四川省成都市
lijiuyun 发表于 2021-4-25 16:06
不愧是精益的成员,中文写的不错,点个赞,加油

中文习惯了 改不过来了 哈哈
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 13 天

发表于 2021-4-25 16:06:39 | 显示全部楼层   湖北省仙桃市

不愧是精益的成员,中文写的不错,点个赞,加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表