python基础(3) —— python爬虫基础

1. 正则表达式

表达式说明
.除了 \n 和 \r 的所有字符
\d数字
\D非数字
\w字母和下划线
\W非字母和下划线
\s空格(包括制表符、换页符等)
[a-z]小写英文字母
[a-zA-Z0-9]大小写英文字母与数字
[123]数字123
[^123]不是数字123
*出现次数>=0
+出现次数>=1
{n}出现次数=n
{n,m}m>=出现次数>=n
^以开头
$以结尾
?关闭贪婪模式
()用于获取括号内匹配成功的字符串

案例

案例1:定义密码的正则表达式
规则:英文字母开头,可以包括数字、大小写英文字母、下划线,6-16位

password pattern=^[a-zA-Z]{1}[a-zA-Z0-9_]{5-15}$
password pattern ==^[a-zA-Z][a-zA-Z0-9_]{5-15}$

案例2:匹配div标签,class="class1"中的文本内容

1< div class="cass1">要匹配的内容</div>

div_pattern1 ='<div class="class1">(.*)</div>'
2<div>< div class="cass1">要匹配的内容</div></div>

div_pattern1 ='<div class="class1">(.*?)</div>'

2. re模块

提取

import re 
ret=re. fingal(【正则表达式】,【被提取的字符串】)

注:返回的类型是列表

匹配

import re
ret= re match(【正则表达式】,【被匹配的字符串】)

注:
如果匹配成功,返回 <cass’ re Match> 对象
如果匹配不成功,返回 None

替换

import re 
ret=re.sub(【正则表达式】,【【替换成的字符串】,【被匹配的字符串】)

代码解析

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <footer>
        <div>
            <div class="email">
                Email:kefu@163.com
            </div>
            <div class="tel">
                手机号:400-600-0109
            </div>
        </div>
    </footer>
</body>
</html>

re_test.py文件

import re
with open('index.html','r',encoding='utf-8') as f:
    html=f.read()
    html = re.sub('\n', '', html) # HTML文件中的回车替换为空格
    print(html)
    # 输出
    '''
    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <footer>        <div>            <div class="email">                Email:kefu@163.com            </div>            <div class="tel">                手机号:400-600-0109            </div>        </div>    </footer></body></html>
    '''
    pattern_1='<div class="email">(.*?)</div>'
    ret_1=re.findall(pattern_1,html)
    print(ret_1[0].strip()) # ret_1[0].strip() 去掉开头结尾的空格符
    # 输出 Email:kefu@163.com

password_pattern =r'^[a-zA-Z][a-zA-Z0-9_]{5,15}$'
pass1='1234567'
pass2='k123456'
pass3='k123'

print(re.match(password_pattern,pass1))
# 输出 None
print(re.match(password_pattern,pass2))
# 输出 <_sre.SRE_Match object; span=(0, 7), match='k123456'>
print(re.match(password_pattern,pass3))
# 输出 None

3. Xpath

XPath语法

表达式描述
/根节点选取载下级
//任意节点,不考虑位置
.当前节点
当前节点的父节点
@选取属性
*匹配任何节点
【nodename】根据节点筛选
contains(@属性,“包含的内容”)模糊查询
text()文本内容

注:XPath中的索引从1开始

案例:

一级分类:  //h3[@class" classify_c_h3"]/a/text()
二级分类:  //div[@class="classify_list"]/span/a/text()
		  //div[contains(@class,"classify list")]/span/a/text()

4. lxml模块

首先摘取一个页面的源码,存放到.html文件中,这里选择CSDN学院的首页,存储文件名为csdn.html

import lxml.etree as le

with open('csdn.html','r',encoding='utf-8') as f:
    html = f.read()
    #print(html)
    html_x = le.HTML(html) # 转换为xpath
    print(html_x) # 输出 <Element html at 0x38a3f80>
    div_xs = html_x.xpath(' //div[@class="classify_cList"]')
    print(div_xs)
    # 输出 list
    '''
    [<Element div at 0xcab18c8>, <Element div at 0xcab18a0>, <Element div at 0xcab1878>, <Element div at 0xcab1850>, <Element div at 0xcab1828>, <Element div at 0xcab15a8>]
    '''
    data_s =[]
    for div_x in div_xs:
        category1 = div_x.xpath('./h3/a/text()')[0]
        #print(category1)
        category2_s = div_x.xpath('./div/span/a/text()')
        #print(category2_s)
        data_s.append(
            dict(
                category1 = category1,
                category2_s = category2_s
            )
        )
        #print(data_s)
        for data in data_s:
            print(data.get('category1'))
            for category2 in category2_s:
                print('    ',category2)
# 输出
'''
人工智能
     机器学习
     深度学习
     计算机视觉
人工智能
     C/C++
     Java
     Python
编程语言
     C/C++
     Java
     Python
人工智能
     华为认证
     思科认证
     软考
编程语言
     华为认证
     思科认证
     软考
考试认证
     华为认证
     思科认证
     软考
人工智能
     iOS
     微信开发
     Swift
编程语言
     iOS
     微信开发
     Swift
考试认证
     iOS
     微信开发
     Swift
移动开发
     iOS
     微信开发
     Swift
人工智能
     Hadoop
     Docker/K8S
     Spark
编程语言
     Hadoop
     Docker/K8S
     Spark
考试认证
     Hadoop
     Docker/K8S
     Spark
移动开发
     Hadoop
     Docker/K8S
     Spark
云计算/大数据
     Hadoop
     Docker/K8S
     Spark
人工智能
     系统/网络/运维
     数据库
     区块链
编程语言
     系统/网络/运维
     数据库
     区块链
考试认证
     系统/网络/运维
     数据库
     区块链
移动开发
     系统/网络/运维
     数据库
     区块链
云计算/大数据
     系统/网络/运维
     数据库
     区块链
其他课程
     系统/网络/运维
     数据库
     区块链
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值