学习笔记_python(爬虫)_第二章-数据提取与解析

本文介绍了如何使用Python的re模块进行正则表达式基础操作,包括查找、匹配和预编译,并通过BeautifulSoup和lxml库解析HTML文档,提取所需信息,如图片名称和链接。
摘要由CSDN通过智能技术生成

1.re解析

掌握基本的正则基础,通过以下网站测试正则

在线正则表达式测试 (oschina.net)

元字符常用:. \w \d

惰性匹配最重要

可以练习以下代码(有详细解释):

import re
# 返回正则匹配的结果,返回形式数组字符串['匹配内容','匹配内容','匹配内容']
list=re.findall(r"\d+","我的电话是10086,小号是10010")
print(list)
# 返回迭代器,group是匹配的结果--最常用
it=re.finditer(r"\d+","我的电话是10086,小号是10010")
for i in it:
    print(i.group())
# 特点:找到匹配的内容直接返回(数据为match对象),不会再往后找
sear=re.search(r"\d+","我的电话是10086,小号是10010")
print(sear.group())
# \d+  相当于 ^\d+
mat=re.match(r"\d+","10086111,小号是10010")
print(mat.group())
# 预编译,相当于把re是obj,obj再内置一个正则
obj=re.compile("\d+")
oj=obj.findall("我的电话是10086,小号是10010")
print(oj)
print("--------------------")
# 提取到的内容进行有需要的筛选,(?P<组名>.*?),re.S:是元字符“.”可以匹配换行符
s="""
<div class='zjl'><span id='1'>周杰伦</span></div>
<div class='ljj'><span id='2'>林俊杰</span></div>
<div class='zxc'><span id='3'>周星驰</span></div>
"""
handop=re.compile("<div class='(?P<en>.*?)'><span id='(?P<id>.*?)'>(?P<name>.*?)</span></div>",re.S)
succ=handop.finditer(s)
for i in succ:
    print(i.group("en"))
    print(i.group("id"))
    print(i.group("name"))

2.bs4解析

案例-获取优美图库首页的图片名称和链接

import requests
from bs4 import BeautifulSoup
import csv
# 优美图库网址
url="http://www.umeituku.com/bizhitupian/weimeibizhi/"
resp=requests.get(url)
# 查看获取网页的charet=utf-8,设置resp的编码utf-8
resp.encoding='utf-8'
# 转化为bs4对象
main_page=BeautifulSoup(resp.text,"html.parser")
# find找到这个标签(找到1次就返回。注意:如果页面标签有2个一模一样的,我们要的在第二个,它只会返回第一个)
# find_all:返回类型是数组
a_s=main_page.find("div",attrs={"class":"TypeList"}).find_all('a')
main_href=[]
# 遍历数组中的每个a标签
for a in a_s:
    # get(“属性名")方法用来得到属性值
    href=a.get('href')
    # 存到数组中
    main_href.append(href)
# 代表了向"优美图库下载链接.csv“输入数据,没有该文件会自动在当前脚本的目录下创建
f=open("优美图库下载链接.csv",mode='w',encoding="utf-8")
# csv.wirter(f)返回值是对象,该对象实现了向f输入数据
csv_writer=csv.writer(f)
# 遍历网页第一页所有链接
for target_href in main_href:
    target_page_resp=requests.get(target_href)
    target_page_resp.encoding='utf-8'
    # bs4对象
    target_page_code=BeautifulSoup(target_page_resp.text,"html.parser")
    # 先用find()找到标签div,再用find_all()返回数组,数组包含了img,分析页面源码知:只有一个img标签
    target_page_imgList=target_page_code.find("div",attrs={"class":"ImageBody"}).find_all('img')
    # 遍历输出
    for img in target_page_imgList:
        # wirterow()存放数据时,用数组形式
        csv_writer.writerow([img.get('alt'),img.get('src')])

print('over!')

3.lxml解析

(1) 在同一目录下,创建a.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>
        <li class="feiji">飞机</li>
        <li class="dapao">大炮</li>
        <li class="huojian">火箭</li>
    </ul>
    <ol>
        <li class="job"> <a>李嘉诚</a> </li>
        <li class="master"><a>马云</a></li>
    </ol>
</body>
</html>

(2)对样的测试及输出

from lxml import etree

# 解析文档
page=etree.parse("a.html")

# 拿到所有li的值
# res=page.xpath("/html/body/ul/li/text()")
# ['飞机', '大炮', '火箭']

# 根据序号或指定的属性名找到对应的标签
# res=page.xpath("/html/body/ul/li[@class='dapao' || 2 ]/text()")
# ['大炮']

# 根据属性名拿到标签的属性值
# res=page.xpath("/html/body/ul/li/@class")
# ['feiji', 'dapao', 'huojian']

# 返回的是一个数组,数组中每项内容是一个标签的地址
res=page.xpath("/html/body/ol/li")
for li in res:
    print(li.xpath("./a/text()"))
    print(li.xpath("./@class"))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值