day2-bs4解析器和csv文件操作

1.贝壳租房
import requests
from re import findall
from json import dumps
import csv

# 1. 发送请求
headers = {
    'user-agent': xxxxxxx
}

response = requests.get('https://cd.zu.ke.com/zufang', headers=headers)

# 2. 获取结果
result = response.text
# print(result)

# 3.解析数据
prices = findall(r'<span class="content__list--item-price"><em>(\d+)</em>', result)
# print(prices)

areas = findall(r'(\d+\.?\d*)㎡', result)
# print(areas)

addresses = findall(r'<a target="_blank" href="/zufang/[a-z]+/">([\u4e00-\u9fa5]+)</a>-<a href="/zufang/[a-z]+/" target="_blank">([\u4e00-\u9fa5]+)</a>-<a title="(.+?)"', result)
# print(addresses)

data = map(lambda i1, i2, i3:{'区': i3[0], '地址': '-'.join(i3), '价格': i1, '面积': i2}, prices, areas, addresses)
# print(list(data))


# with open('files/租房信息.json', 'w', encoding='utf-8') as f:
#     f.write(dumps(list(data)))

# 获取文件对象
f = open('files/租房.csv', 'w', encoding='utf-8', newline='')
w = csv.DictWriter(f, ['区', '地址', '价格', '面积'])

# 写入数据
w.writeheader()
w.writerows(list(data))
2. csv 文件写操作
import csv
# 1.创建writer对象
# csv.writer(csv文件对象)   -  写入数据的时候一行内容对应一个列表
# csv.DictWriter(csv文件对象,字段名列表)    -  写入数据的时候一行内容对应一个字典

# 1)使用writer
# 获取文件对象  - 打开文件(w、a)
# 获取文件对象  - 打开文件(w、a)
f1 = open('files/data1.csv', 'w', encoding='utf-8', newline='')
w1 = csv.writer(f1)

# 2)使用DictWriter
f2 = open('files/data2.csv', 'w', encoding='utf-8', newline='')
w2 = csv.DictWriter(f2, ['姓名', '年龄', '分数'])

# 2.写入数据
# writer对象.writerow(一行数据)
# writer对象.writerows(多行数据)

# 1)writer写入数据
w1.writerow(['姓名', '年龄', '分数'])
w1.writerow(['小明', 18, 90])
w1.writerows([
    ['小花', 20, 70],
    ['小华', 19, 80],
    ['小天', 20, 60]
])

# 2)DictWriter写入数据
# 将字段作为第一行内容
w2.writeheader()
w2.writerow({'姓名': '小明', '年龄': 18, '分数': 98})
w2.writerow({'姓名': '小花', '年龄': 20, '分数': 78})
w2.writerows([
    {'姓名': '小君', '年龄': 18, '分数': 85},
    {'姓名': '小天', '年龄': 19, '分数': 81}
])
3. csv 文件读操作
import csv

# 1.创建reader
# csv.reader(csv文件对象)  -  每一行对应一个列表获取数据
# csv.DictWriter(csv文件对象)  -  每一行对应一个字典获取数据

# 1)reader
f1 = open('files/租房.csv', 'r', encoding='utf-8')
r1 = csv.reader(f1)
# print(r1)   # <_csv.reader object at 0x000001CE394F28C0>   迭代器

f2 = open('files/租房.csv','r', encoding='utf-8')
r2 = csv.DictReader(f2)

# 2)获取内容
print(next(r1))
print(list(r1))

print(next(r2))
for x in r2:
    print(x)
4. html
1.前端开发的三大技术:

1)html - 负责给网页提供内容(通过各种各样的标签给网页提供各种各样的内容)
2)css - 负责网页内容的样式和布局
3)js - 负责网页内容变化

注意:输入标签名 + tab

2.html

一个网页对应一个html文件,html文件内容就可以构建一个网页。
html为网页提供的内容的基本单位是标签。

1)标签(元素)语法:
双标签:<标签名 属性名1=属性值1 属性名2=属性值2 …>标签内容</标签名>
单标签:<标签名 属性名1=属性值1 属性名2=属性值2 …> 或者 <标签名 属性名1=属性值1 属性名2=属性值2 …

2)常见标签

标题标签:h1~h6
段落标签:p
图片: img (通过src属性来提供图片的 - scr属性保存图片的地址)
超链接:a (通过href属性提供跳转地址,通过标签内容提供可点击内容)

<!--html版本说明-->
<!DOCTYPE html>

<!--html标签代表整个网页-->
<html lang="en">
    <!-- head标签控制网页顶部的显示-->
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>

    <!-- body标签控制内容的显示-->
    <body>
        <h1>1级标题</h1>
        <br>
        <p>段落</p>

        <img src="./files/花.png" alt="" title="花花">
        <img src="./files/花1.png" alt="">

        <hr>

        <a href="https://www.baidu.com">百度</a>
        <br><br>
        <a href="https://www.baidu.com/s?wd=%E7%99%BE%E5%BA%A6%E7%83%AD%E6%90%9C&sa=ire_dl_gh_logo_texing&rsv_dl=igh_logo_pcs">
            <img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" alt="">
        </a>
        <hr>

        <input type="text">
        <button>确定</button>
        <br><br>


    </body>
</html>
5. css 选择器

css(层叠样式表,简称样式表)负责网页内容的样式和布局的。

1.css代码写在哪?

1)内联样式表:将样式写在标签的style属性中
2)内部样式表:将样式写在style标签中(style标签通常放在head中)
3)外部样式表:将样式写在css文件中,然后在html文件中用link标签导入

2.css怎么写?

选择器{属性1:属性值1; 属性2:属性值2; …}

选择器 - 选中需要设置样式的标签(找标签)

3.选择器(重点!!!)

1)元素选择器(标签选择器):

直接将标签名作为选择器,选中网页中所有的指定标签
a{} - 选中所有的a标签
p{} - 选中所有的p标签

2)class选择器:

  • a.在标签class属性值前加.作为一个选择器,选中class属性值为指定值的标签
    .c1 - 选中所有class属性值为c1的标签
    .person - 选中所有class属性值为person的标签

  • b.将’标签名.class属性值’结构作为一个选择器,选中所有class属性值为指定值的指定标签
    p.c1{} - 选中所有class属性值为c1的p标签
    a.c2{} - 选中所有class属性值为c2的超链接

  • c.将’.class属性值1.class属性值2.class属性值3…'结构作为一个选择器,选择class属性同时为指定值的标签
    .c1.c2{} - 选中class属性值同时为c1和c2的所有标签
    .c1.c2.c3{} - 选中class属性值同时为c1和c2和c3的所有标签

**注意:**多个不同的标签可以拥有相同的class属性值;同一个标签可以同时拥有多个不同的class属性值

3)id选择器:

在id属性值前面加#作为一个选择器,选中id属性值为指定值的标签(id属性值是唯一的)
#p1{} - 选中id属性为p1的标签

4)子代选择器:

将多个独立的选择器用>连接作为一个选择器
div>.c1{} - 选中div的子标签中所有class值为c1的标签
.c2>p{} - 选择class为c2中标签中所有的p标签(前后是父子关系)

5)后代选择器:

将多个独立的选择器用空格隔开作为一个选择器
div .c1{} - 选择div的后代标签中所有class值为c1的标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!-- 2.内部样式-->
    <style>
        a{color:green;}

        .c1{color:purple}
        p.c1{font-size:18px}

        .c2{background-color:yellow}

        .c1.c2{
            font-size:19px;
            border:2px solid red;
        }

        #s2{
            font-size:36px
        }

        div>.c4{color:red}

        div .c4{background-color:green}

    </style>

    <!-- 3.外部样式-->
    <link rel="stylesheet" href="外部.css">

</head>
<body>
    <!-- 1.内联样式-->
    <!-- <p style="color:red;font-size:18px">我是段落2</p>-->
    <a href="">我是超链接1</a>
    <span>我是span1</span>
    <a href="">我是超链接2</a>
    <p class="c1 c3">我是段落1</p>
    <a href="" class="c1">我是超链接3</a>
    <span class="c1 c2" id="s2">我是span2</span>
    <p >我是段落2</p>
    <p class="c1 c2 c3">我是段落3</p>

    <hr>

    <p class="c4">我是段落4</p>
    <a href="">我是超链接4</a>
    <p>我是段落5</p>
    <span class="c4">我是span3</span>
    <div>
        <p>
            <span class="c4">我是span4</span>
        </p>
        <a href="" class="c4">我是超链接5</a>

    </div>

</body>
</html>
6.bs4数据解析
import requests
# 注意:使用BeautifulSoup来对网页进行解析安装第三方库:beautifulsoup4,然后在通过bs4使用这个库
from bs4 import BeautifulSoup

# 0.准备网页源代码
headers = {
    'User-Agent': xxxxxx
}
response = requests.get('https://movie.douban.com/top250', headers=headers)
html = response.text

# 1.创建soup对象
# BeautifulSoup(网页源代码, 'lxml') - 根据指定的网页源代码创建soup对象并且返回(suop对象就是整个网页)
soup = BeautifulSoup(html, 'lxml')


# 2.获取标签
# 1)使用soup获取标签
# soup对象.select(css选择器)      - 获取css选择器选中的所有标签,返回一个列表,列表中的标签是被选中的所有的标签对象
# soup对象.select_one(css选择器)  - 获取css选择器选中的第一个标签,返回一个标签对象
all_a = soup.select('a')
# print(all_a)

title_a = soup.select('.nav-items a')
print(title_a)

div1 = soup.select_one('#doubanapp-tip')
print(div1)

# 2)使用标签获取标签
# 标签对象.select(css选择器)     - 获取指定标签中选择器选择的所有标签
# 标签对象.select_one(css选择器) - 获取指定标签中选择器选择的第一个标签
result = div1.select('a')
print(result)

result = div1.select_one('a')
print(result)


# 3.获取标签内容和标签属性
# 1)获取标签内容:标签对象.text
for x in title_a:
    print(x.text)

# 2)获取标签属性值:标签对象.attrs[属性名]
for x in title_a:
    print(x.attrs['href'])
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值