正则表达式在网页内容提取上也非常有用,下面的案例从一个网页中提取图片的网络地址。
案例代码如下:
import re content = """<html> <head> <title>java课程</title> </head> <body> <h3>java课程</h3> <img src="https://www.milihua.com/002.png" alt="Java课程"/> <p>课程主要介绍java基础知识</p> <img src="https://www.milihua.com/001.jpg" alt="Java课程"/> <video src="https://www.milihua.com/001.jpg" alt="Java课程"/> </boyd> <html>""" # 创建正则对象 pattern = re.compile(r"img.*src=\"(.+?\.[a-z]+)\"") # 识别图片链接地址 m = pattern.findall(content) print(m)
程序执行结果如下:
['https://www.milihua.com/002.png', 'https://www.milihua.com/001.jpg']
正则表达式“img.*src=\"(.+?\.[a-z]+)\"”,从“img”开始匹配,“img”字符串后面可匹配0到任意个字符,紧跟匹配的是“src=”字符串(这里没有考虑src和=之间的空白字符),然后匹配“\"”,后面匹配的是一个子表达式(.+?\.[a-z]+),子表达式在Python语言中也称为组合,该组合的“.+?”可匹配多个任意字符,”\.[a-z]+”匹配图片的扩展名。
Python的re模块支持正则表达式,执行正则表达式时,需要导入re模块,re模块的使用请学习课程《Python零基础入门》。
使用正则表达式也可以提取网页的表格数据,下面是网页的表格内容:
<table> <tr> <th>姓名</th> <th>电话</th> <th>电子邮件</th> <th>职务</th> </tr> <tr> <td>张三</td> <td>18278900988</td> <td>zhangsan@163.com</td> <td>研发工程师</td> </tr> <tr> <td>王二</td> <td>16589012689</td> <td>wanger@163.com</td> <td>研发经理</td> </tr> <tr> <td>李四</td> <td>17230019065</td> <td>lisi@163.com</td> <td>研发工程师</td> </tr> </table>
使用下面的正则程序可以提取表格数据:
import re # 创建正则对象 pattern = re.compile(r"<th>(.*)</th>") # 提取表格标题 title = pattern.findall(content) print(title) # 提取表格行数据 pattern = re.compile(r"<tr>") #表格的每行数据分隔为一个列表 entries = pattern.split(content) # 从表格行中提取表格栏数据 for entry in entries: pattern = re.compile(r"<td>(.*)</td>") text = pattern.findall(entry) # 若匹配成功输出表格栏内容 if text: print(text)
案例代码的content为HTML表格内容。
用正则表达式“<th>(.*)</th>”提取表格标题栏数据,表格标题栏数据被放置在一个列表title内。
调用正则对象的split()方法,使用正则表达式“<tr>”将表格数据按表格行进行分隔,分隔后表格行数据放置在列表entries内。
迭代列表entries,使用正则表达式“<td>(.*)</td>”提取表格行的栏数据。
程序执行结果如下所示:
['姓名', '电话', '电子邮件', '职务'] ['张三', '18278900988', 'zhangsan@163.com', '研发工程师'] ['王二', '16589012689', 'wanger@163.com', '研发经理'] ['李四', '17230019065', 'lisi@163.com', '研发工程师']