求解一个python正则表达式问题

查看:79
本文介绍了求解一个python正则表达式问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

有一个文本

<html>
<div class="timeandicon">
            <div class="cf">
                <dl>
                    <dd class="mar-b8"><i class="time-icon"></i><em>5课时 39分钟</em>
                    </dd>
                    <dd class="zhongji">
                        
                    <i class="xinhao-icon2"></i><em>中级</em>
                    </dd>
                    
                </dl>
                <em class="learn-number">578人学习</em>
            </div>
</div>
<div class="timeandicon">
            <div class="cf">
                <dl>
                    <dd class="mar-b8"><i class="time-icon"></i><em>14课时 37分钟</em>
                    </dd>
                    <dd class="zhongji">
                        
                    <i class="xinhao-icon2"></i><em>中级</em>
                    </dd>
                    
                </dl>
                <em class="learn-number">50228人学习</em>
            </div>
</div>

<html>

想把他匹配进一个字典test
test['keshi']=['5课时 39分钟','14课时 37分钟']
test['level']=['中级','中级']这样的

看了慕课的教程。里面说
title_node=soup.find('i',class_="time-icon").find("em")
视频中是这样写的 但是我运行出错是什么原因,还有没有别的方法去匹配??

解决方案

title_node=soup.find('i',class_="time-icon").find("em")
你这个是 bs4 的 css 选择器,不是 正则。

<i class="time-icon"></i><em>5课时 39分钟</em>

你仔细看标签元素的层次关系, iem 是平级的,
em 并不是 i 的子元素。
所以,你的 find 方法是找不到 em 的。


给个正则的例子:

html='''<html>
<div class="timeandicon">
            <div class="cf">
                <dl>
                    <dd class="mar-b8"><i class="time-icon"></i><em>5课时 39分钟</em>
                    </dd>
                    <dd class="zhongji">
                        
                    <i class="xinhao-icon2"></i><em>中级</em>
                    </dd>
                    
                </dl>
                <em class="learn-number">578人学习</em>
            </div>
</div>
<div class="timeandicon">
            <div class="cf">
                <dl>
                    <dd class="mar-b8"><i class="time-icon"></i><em>14课时 37分钟</em>
                    </dd>
                    <dd class="zhongji">
                        
                    <i class="xinhao-icon2"></i><em>中级</em>
                    </dd>
                    
                </dl>
                <em class="learn-number">50228人学习</em>
            </div>
</div>

<html>'''

import re

ptn = re.compile(r'<div[^>]*?class="cf".*?<dl>.*?'
                 r'<em>([^<]*?)</em>.*?' # 课时
                 r'<em>([^<]*?)</em>.*?' # 级别
                 r'</dl>.*?</div>'
                 ,re.S)
mch = ptn.findall(html)
keys = ('课时', '级别')
info = [dict(zip(keys, data)) for data in mch]
print(info)

结果:

[{'级别': '中级', '课时': '5课时 39分钟'}, {'级别': '中级', '课时': '14课时 37分钟'}]

这篇关于求解一个python正则表达式问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆