小白学习爬虫的第三天之数据解析bs4与pyQuery的使用

一. bs4的使用

1.html页面解析的方法

"""
1)正则表达式     -   出神入画的正则;不懂前端(re)
2)通过css选择器选中标签  -   熟悉css选择器;熟悉jQuery(bs4,pyQuery)
3)通过xpath获取标签   -   熟悉html结构和标签(lxml)
"""
from bs4 import BeautifulSoup
import requests
# 准备数据
def get_data():
    with open('files/安居客.html', encoding='utf-8') as f:
        return f.read()

2.bs4的使用
1)根据网页内容创建解析器对象

# BeautifulSoup(网页内容, 解析器类型)
# 网页内容  -   html格式的字符串;一般是通过requests或者selenium获取页面数据
# bs4有网页纠错功能

soup = BeautifulSoup(get_data(), 'lxml')

2)根据css选择器获取标签

"""
bs对象.select(css选择器) -   获取选择器选中的标签
bs对象.select_one(css选择器) -   获取选择器中的第一个标签
"""
houses_name_els = soup.select('.items-name')
print(houses_name_els)

houses_details = soup.select('.favor-pos')

3)根据属性和内容获取标签

# a.标签内容
# 标签对象.string   -   若有子标签则返回None
# 标签对象.get_text()   -   将子标签中的内容与需要取的标签内容一起取到并拼接成一个字符串
# 标签对象.contents -   如果有其中有子标签会将子标签一起取到(返回的是列表)

for item in houses_name_els:
    print(item.string)   # None
    # print(item.get_text())   # 新都多弗成都奥特莱斯
    # print(item.contents)   # [<span>新都</span>, '多弗成都奥特莱斯']
# b.标签属性值
# 标签对象.attrs[属性名]
for x in houses_details:
    print(x.attrs['href'])
# 练习:获取价格和图片
print('=============================')
prices = soup.select('.price')
for x in prices:
    print(x.get_text())


imgs = soup.select('.pic > img')
for x in imgs:
    print(x.attrs['src'])
# 4)获取标签内容和属性
# a.find_all(attrs={属性1:属性值1, 属性2:属性值2,...})  -  获取指定属性是指定值的所有标签
houses_price = soup.find_all(attrs={'class': 'price'})
for x in houses_price:
    print(x.get_text())

二. bs4的应用

from bs4 import BeautifulSoup


# 准备数据
def get_data():
    with open('files/安居客.html', encoding='utf-8') as f:
        return f.read()


def analysis_data(data):
    soup = BeautifulSoup(data, 'lxml')

    # 获取所有楼盘对应的div
    house_boxs = soup.select('.list-results .item-mod')
    all_house = []
    for h_div in house_boxs:
        name_tag = h_div.select_one('.items-name')
        price_tag = h_div.select_one('.price')
        pic_tag = h_div.select_one('.pic>img')

        house = {
            'name': name_tag.get_text() if name_tag else None,
            'price': price_tag.get_text() if price_tag else None,
            'pic_url': pic_tag.attrs['src'] if pic_tag else None
        }
        all_house.append(house)
    print(all_house)


if __name__ == '__main__':
    analysis_data(get_data())

三. pyQuery的使用

from pyquery import PyQuery
# 准备数据
def get_data():
    with open('files/安居客.html', encoding='utf-8') as f:
        return f.read()

1.创建PyQuery对象

# PyQuery(html格式的字符串)
# doc指向html标签
doc = PyQuery(get_data())

2.获取标签

# PyQuery对象(css选择器)     -   选中css选择器选中的标签,返回PyQuery对象
names = doc('.items-name')
print(names)

3.获取标签内容

# PyQuery对象.text()
# 直接操作PyQuery对象会直接作用于这个对象中所有的标签
print(names.text())

# 遍历PyQuery对象得到的是这个容器中的每个标签
for x in names:
    # x  -  标签
    # PyQuery(x)  -  标签对应的jQuery对象
    print(x, PyQuery(x).text())

4.获取标签属性

# 1)value属性
# PyQuery对象.val()

# 2)普通属性
# PyQuery对象.attr(属性名)
result = doc('.pic>img')
for x in result:
    print(PyQuery(x).attr('src'))

四. pyQuery的应用

from pyquery import PyQuery


# 准备数据
def get_data():
    with open('files/安居客.html', encoding='utf-8') as f:
        return f.read()


def analysis_data(data):
    doc = PyQuery(data)
    all_hous_tag = doc('.key-list.imglazyload>.item-mod')
    for x in all_hous_tag:
        pq_x = PyQuery(x)
        name = pq_x('.items-name').text()
        area = pq_x('.building-area').text()
        price = pq_x('.price').text()
        title = pq_x('.group-mark.soj').text()
        house = {
            'name': name,
            'area': area,
            'price': price,
            'title': title
        }
        print(house)


if __name__ == '__main__':
    analysis_data(get_data())
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值