正则表达式 bs4解析 xpath解析

#正则
#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(“分组名字”)

正则补充:

import re

# 匹配单个字符
# move = input('请输入你要看的最后一个数字或者字母:')
result = re.match(r"速度与激情.", "速度与激情b").group()
# result.group()

# 匹配多个字符
result1 = re.match(r"速度与激情\d{学习计划,2}", "速度与激情22").group()
result2 = re.match(r"速度与激情\d{学习计划,3}", "速度与激情342").group()
result3 = re.match(r"021-?\d{8}", "02112345678").group()

result4 = re.match(r"021-?\d{8}", "021-12345678").group()
result5 = re.match(r"\d{3,4}-?\d{7,8}", "0476-4583719").group()

html_content = '''冲冲冲
加油!'''
result6 = re.match(r".*", html_content).group()
result7 = re.match(r".*", html_content, re.S).group()
import re


def main():
    names = ['age', '_age', '1age', 'a_age', 'age1', 'age_1_', '1_age']
    for name in names:
        ret = re.match(r"^[a-zA-Z_]+$", name) # ^开始匹配的头,$匹配结束的尾
        if ret:
            print('变量名:%s 符合要求...通过正则匹配出来的数据是:%s'% (name,ret.group()))
        else:
            print('变量名:%s 不符合要求'% name)


if __name__ == '__main__':
    main()
import re


def main():
    email = input('请输入你的邮箱:')
    # 如果在正则表达式中 需要用到了某些普通的字符,比如 . 比如 ? 等,仅仅需要在他们前面添加一个  反斜杠进行  转义
    ret = re.match(r"^[a-zA-Z_0-9]{4,20}@(163|126|qq)\.com$", email)
    if ret:
        print('%s 符合条件。。。' % email)
    else:
        print('%s 不符合条件。。。' % email)


if __name__ == '__main__':
    main()

    '''
    学习计划,不要觉得学了正则,一切都可以匹配到,那如果你爬的HTML里面没有加载ip地址呢?首先验证下,ip地址是否存在于HTML,
    不是通过网页,而是代码返回的response中查看。2,正则表达有问题吧,/这个字符在正则表达式里需要转义符(\)转义的
    3, 解决问题需要考虑方法和效率, 用XPATH 或  bs4 明显要比 正则表达式简单的多,为什么弃而不用呢?  没学的话,抓紧时间去学。

作者:漫步
链接:https://www.zhihu.com/question/268774697/answer/341512518
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    '''
import re


def main():
    ns_test = '''<div class="job-detail">
岗位职责:
<br> 学习计划.本职位主要是参与电子数据取证/分析产品模块设计和研发;
<br> 2.主语言是python,但会涉及go,要求代码能同时运行Windows与Linux平台;
<br> 3.根据项目计划按时完成软件开发和单元测试工作以及Bug修复;
<br> 4.不断学习并运用新的知识提升产品竞争力。
<br>任职要求:
<br> 学习计划.本科及以上学历,思维清晰,沟通良好,具备良好的分析、理解、解决问题的能力;
<br> 2.理解数组,链表,树的等基本数据结构。了解设计模式;
<br> 3.至少有python 1年以上实际项目经验;
<br> 4.了解Linux常用命令,了解TCP/IP协议簇;
<br> 5.熟悉git基本操作。
<br>
<br>加分项:
<br> 学习计划.维护技术博客/公众号,或者有开源项目者优先;
<br> 2.有C++/go开发基础者;
<br> 3.有Linux下开发经验者;
<br> 4.有Windows维护经验者(了解注册表,Powershell之类)。
</div>'''
    ret = re.sub(r"<br>", '', ns_test)
    print(ret)


if __name__ == '__main__':
    main()

案例  豆瓣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()





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itLaity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值