2021-05-09
Posted J哥。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-05-09相关的知识,希望对你有一定的参考价值。
#正则
#bs4 解析
#Xpath解析
正则 re
import re
# list = re.findall(r'\\d{11}','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')
list = re.findall(r'\\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')
# findall :匹配字符串中所有符合正则的内容 用的并不是太多
print(list)
# finditer:匹配字符串中所有的内容 ,但返回的是迭代器, 从迭代器中拿到内容需要 .group()
it = re.finditer(r'\\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')
# print(it)
for i in it:
print(i.group())
print('======search====')
# search 返回的结果是 match 对象 。拿数据需要 .group()
# search 有一个特点: 找到一个结果就返回 第二个取不到
s = re.search(r'\\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')
print(s.group())
print('=========match=======')
# match 从头开始匹配 相当于^
c = re.match(r'\\d+','18047653655,女朋友的电话号码是:15104808753')
print(c.group())
print('========预加载=======')
#预加载正则表达式
obj = re.compile(r"\\d+")
ret = obj.search('我的电话号码是:18047653655,女朋友的电话号码是:15104808753')
print(ret.group())
# (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容 .group(“分组名字”)
案例 豆瓣top250
import requests
import re
import csv
url = 'https://movie.douban.com/top250'
heades = { # headers
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
rsep = requests.get(url,headers=heades)
page_content = rsep.text #源代码
#解析数据
obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>.*?<br>(?P<year>.*?) .*?<span class="rating_num" property="v:average">(?P<pf>.*?)</span>.*?'
r'<span>(?P<num>.*?)人评价</span>',re.S)
ret = obj.finditer(page_content)
f = open("data.csv", mode='w',encoding='utf-8')
csvwriter = csv.writer(f)
for page in ret:
dic = page.groupdict()
dic["year"] = dic["year"].strip()
csvwriter.writerow(dic.values())
f.close()
print('完成!')
# print(page.group("name"))
# print(page.group("year").strip())
# print(page.group("pf"))
# print(page.group("num"))
案例:
3_2_屠戮盗版天堂.py
#最新影片推荐提取
import requests
import re
import csv
url = 'https://www.dytt8.net/index.htm'
# https://www.dytt8.net/html/gndy/dyzz/20210505/61398.html
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
resp = requests.get(url , verify=False) #verify=False 去掉安全验证
# charset=gb2312
resp.encoding = 'gb2312' #指定字符集 ,系统默认 utf-8
page_c = resp.text
# ret = re.compile(r"最新影片推荐.*?<ul>.*?<a href='.*?'>(?P<name>.*?)</a>.*?</ul>",re.S)
# ret = re.compile(r"最新影片推荐.*?<ul><tr><a href=(?P<UL>'.*?')>(?P<name>.*?)</a><br/></tr>.*?</ul>",re.S)
obj1 = re.compile(r"最新影片推荐.*?<ul>(?P<name>.*?)</ul>",re.S)
obj2 = re.compile(r"<a href='(?P<href>.*?)'",re.S)
# <div class="title_all"><p>最新影片推荐</p></div>
# <div class="co_content4">
# <ul>
# <tr>
# <a href='/html/gndy/dyzz/20210427/61361.html'>2021年高分纪录片《地球改变之</a><br/>
# </tr>
ret1 = obj1.finditer(page_c)
child_href_list = []
for i in ret1:
ul = i.group("name")
# print(ul)
# print(i.group("name"))
#提取子页面连接
ret2 = obj2.finditer(ul)
for it in ret2:
print(it.group("href"))
# 拼接子页面的url地址 : 域名+ 子页面地址
child_href = url + it.group("href").strip('/')
child_href_list.append(child_href) # 保存子页面连接
#提取子页面内容
for ran in child_href_list:
respons = requests.get(ran,verify=False)
respons.encoding = 'gb2312'
print(respons.text)
break # 本人声明: 我这个网址有问题所以提取子页面内容的部分先 过 不是说我不会
bs4使用案例:
import requests
from bs4 import BeautifulSoup
import csv
#1.拿到页面源代码 ,2.使用bs4进行解析,拿到数据
url = 'http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml'
hearders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
resp = requests.get(url,headers=hearders)
# print(resp.text)
f = open("蔬菜.csv",mode='w',encoding='utf-8')
csvwriter = csv.writer(f)
# 解析数据
#把页面源代码交给 BeautifulSoup 进行处理,生成bs对象
page = BeautifulSoup(resp.text,"html.parser") #"html.parser" 告诉BeautifulSoup 我是html 不告诉的话会出现警告
# 从bs对象中查找数据 : find(标签,属性=值) 就找第一个 find_all() 全都找出来
# table = page.find("table",class_="hq_table") # class是python的关键字
table = page.find("table",attrs={"class":"hq_table"}) #和上一行一个意思
print(table)
#拿到所有数据行
trs = table.find_all("tr")[1:]
for tr in trs: #每一行
tds = tr.find_all("td") # 拿到每一行中的所有td
name = tds[0].text # .text 表示拿到被标签标记的内容
low = tds[1].text # .text 表示拿到被标签标记的内容
avg = tds[2].text # .text 表示拿到被标签标记的内容
gui = tds[3].text # .text 表示拿到被标签标记的内容
king = tds[4].text # .text 表示拿到被标签标记的内容
baby = tds[5].text # .text 表示拿到被标签标记的内容
high = tds[6].text # .text 表示拿到被标签标记的内容
csvwriter.writerow([name,low,avg,gui,king,baby,high])
f.close()
print('over!')
抓取优美图库bs4:
from bs4 import BeautifulSoup
import requests
import time
import csv
url = 'https://www.umei.net/bizhitupian/weimeibizhi/'
hearders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
# charset=utf-8"
resp = requests.get(url, headers=hearders)
resp.encoding = 'utf-8'
# print(resp.text)
rot = BeautifulSoup(resp.text, "html.parser")
table = rot.find("div", class_="TypeList").find_all("a") # 范围第一次缩小
# print(table)
for a in table:
href=a.get("href") # 直接通过 get 就可以拿到属性的值
# print(href)
# 那子页面的源代码
child = requests.get(href)
child.encoding = 'utf-8'
child_text = child.text
# 从子页面中拿到图片的下载路径
child_page = BeautifulSoup(child_text, 'html.parser')
p_img = child_page.find('p', align="center").find('img')
src = p_img.get("src")
# print(p_img.get("src"))
#图片的下载
img_a = requests.get(src)
# img_a.content # 这里拿到的是字节
img_name = src.split("/")[-1] #拿到url 中最后一个/以后的内容
with open("img/"+img_name ,mode= "wb" ) as f:
# with open('相册', mode="wb") as f:
f.write(img_a.content) #图片内容 写入文件
print('over!!!')
time.sleep(1)
f.close()
xpath解析:
# xpath 是在 XML 文档中搜索内容的一门语言
# html 是 xml 的一个子集
from lxml import etree
'''
/html/body/ul/li/a href=""
/ol/a
/div class=""
'''
#xpath 解析
xml = []
tree = etree.XML(xml)
tree1 = etree.parse("b.html")
# tree.xpath("/book") # / 表示层级关系 ,第一个/是根节点
# tree.xpath("/book/name")
ret1 = tree.xpath("/html/book/name/text()") #text() 拿文本
ret2 = tree.xpath("/html/book/body/ul/li/a/text()") #text() 拿文本
ret3 = tree.xpath("/html/book/body/ul/li[1]/a/text()") # Xpath 的顺序是从1开始数的 text() 拿文本 []表示的是 索引
ret4 = tree.xpath("/html/book/body/ul/ol/li/a[@href='dapao']/text()") #[@xxx= "xxx"] 是属性的筛选
ret6 = tree.xpath("/html/book/body/ul/ol[2]/a/text()")
ol_li_list = tree.xpath("/html/body/ol/li")
for i in ol_li_list:
#从每个li中提取到文字信息
result = i.xpath("./a/text()") # ./ 属于相对查找 在这里就是相对于 li 进行查找
print(result)
# 提取出 a 标签 href的值
result2 = i.xpath("./a/@href") #拿属性值 @属性
print(result2)
print("")
xpath实战猪八戒网:
import requests
from lxml import etree
import csv
url = 'https://beijing.zbj.com/search/f/?type=new&kw=python'
# kw = input("输入要查找的语言:")
params ={
'type' : 'new',
'kw' : 'python',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
resp = requests.get(url,headers=headers)
html = etree.HTML(resp.text)
# print( resp.text)
# tree = etree.parse()
f = open("数据.csv" , mode='w' , encoding= 'utf-8 ')
csvwriter = csv.writer(f)
# 服务商的div
divs = html.xpath('/html/body/div[6]/div/div/div[2]/div[6]/div[1]/div')
# print(divs)
for div in divs: #每一个服务商的信息
# html1 = etree.HTML(divs.text)
span = div.xpath("./div/div/a[1]/div[2]/div[1]/span[1]/text()")[0].strip("¥")
p = "python".join(div.xpath("./div/div/a[1]/div[2]/div[2]/p/text()"))
com_name = div.xpath("./div/div/a[2]/div/p/text()")[0]
location = div.xpath("./div/div/a[2]/div/div/span/text()")[0]
csvwriter.writerow([span,p,com_name,location])
# print(location)
# // *[ @ id = "utopia_widget_51"] / a[1] / div[2] / div[1] / span[1]
# / html / body / div[6] / div / div / div[2] / div[6] / div[1] / div[1]
#<div class='service-shop clearfix'>
# /html/body/div[6]/div/div/div[2]/div[6]/div[1]
#<p class='text-overflow'><img src='https://as.zbjimg.com/static/nodejs-zbj-search-api/widget/localize-service/img/shop_9088d78.png'/>拓冠科技-行业之星服务商</p>
print("完成!!")
f.close()
以上是关于2021-05-09的主要内容,如果未能解决你的问题,请参考以下文章