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>.*?)&nbsp.*?<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的主要内容,如果未能解决你的问题,请参考以下文章

《安富莱嵌入式周报》第211期:2021.05.03--2021.05.09

2021-05-09

2021-05-09

2021-05-09

2021-05-09

2021-05-09