1.re解析
掌握基本的正则基础,通过以下网站测试正则
元字符常用:. \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"))