一. 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())