bs4_lxml的基本用法(不同于正则和xpath)

1.本文件需要引用的index.html文件代码为:




    
    bs4测试网页
    


    百度一下
    

qwertyui

python爬虫工程师

python后台工程123456

数据分析工程师

123 456

2. 需要下载bs4包 pip install bs4

引入包

from bs4 import BeautifulSoup
import codecs

3.基本知识

 BeautifulSoup 是python支持的一个第三方的包,作用是用来解析html网页,提取数据

 lxml 第三方解析包,解析html速度比较快,功能强大,底层是C语言实现的

  参数: 1.html源代码   2.解析器lxml
  bs跟节点对象

bs = BeautifulSoup(codecs.open('index.html', 'r', encoding='utf-8'), 'lxml')

4.三种类型

  4.1.bs是BeautifulSoup类型的对象

# print(bs.prettify())  # 和print(bs)输出结果一样
# print(type(bs))

  4.2. 子节点的类型

  

print(bs.title)
print(type(bs.title))    
print(bs.head.title)

  name  节点的名称 ,bs.name获取到的是[document]

  对于a \p \div等标签来说,获取到的就是标签的名称

print(bs.name)
print(bs.title.name)
attrs 获取标签节点的属性,返回的是一个 key:value形式的字典,如果某个属性有多个值,返回value就是一个列表

print(bs.a.attrs)

  获取某一个属性值

print(bs.a['href'])
print(bs.a['id'])

 有多个属性值,获取到的是列表

print(bs.a['class'])
print(type(bs.a['class']))

 4.3.bs4.element.NavigableString  类型 节点之间的text文本

print(bs.a.string)

print(type(bs.a.string))

  bs4 是将html代码转换为一个python对象(BeautifulSoup)
  Tag:指的是html中的一个标签(包含开始标签和结束标签在内的整个标签) name,attrs,string

  NavigableString:指的就是标签中的文字,不包含标签

5.常用的属性

  contents获取直接子节点,返回的是一个列表

print(bs.contents)
print(bs.head.contents)
print(bs.body.contents)

  根据索引从所有节点中取出某一个


title = bs.head.contents[3]
print(title.string)


 children返回的是一个列表生成器对象


res = bs.head.children
# print(res)
# for循环遍历子节点   ele 就是子节点
for ele in res:
    print(ele)

  descendants获取子孙节点(包含子节点,子节点的子节点,每个子节点的内容),返回的结果是一个生成器对象


print(bs.body.descendants)
res = bs.body.descendants
for ele in res:
    print(ele)

  获取子节点的父节点

print(bs.title.parent)

  next_sibling获取节点的下一个兄弟节点

print(bs.meta.next_sibling.next_sibling)

   previous_sibling获取节点的上一个兄弟节点

print(bs.title.previous_sibling.previous_sibling)

 搜索文档中的数据

 直接通过标签名 查找标签

res = bs.find_all('p')
print(res)

 可以同时根据多个标签名查找标签

res = bs.find_all(['a', 'p', 'title'])
print(res)
  find()函数 查找唯一标签
print(bs.find(id='top'))
# find_all()
 通过 class类名查找,不能直接写class,因为class是python关键字  使用 class_代替class
print(bs.find_all(class_='two'))

6.法一:通过css选择器查找标签,返回的是列表,列表中存放的是查找到的标签

print(bs.select('#data'))
print(bs.select('#web span'))
print(bs.select('.two'))
  法二:找到指定标签 指定属性值
print(bs.select('a[target="_blank"]'))

 法三:找到某个标签下的 指定属性值的标签

print(bs.select('div .spider'))
print(bs.select('.spider'))


完整代码:

# -*- coding:utf-8 -*-
# 需要下载bs4包 pip install bs4
# lxml
from bs4 import BeautifulSoup
import codecs
# BeautifulSoup 是python支持的一个第三方的包,作用是用来解析html网页,提取数据
# lxml 第三方解析包,解析html速度比较快,功能强大,底层是C语言实现的

# 1.html源代码   2.解析器lxml
# bs跟节点对象
bs = BeautifulSoup(codecs.open('index.html', 'r', encoding='utf-8'), 'lxml')

# 1.bs是BeautifulSoup类型的对象
# print(bs.prettify())  # 和print(bs)输出结果一样
# print(type(bs))

print(bs.title)
# 2. 子节点的类型
print(type(bs.title))
print(bs.head.title)
# name  节点的名称 ,bs.name获取到的是[document]
# 对于a \p \div等标签来说,获取到的就是标签的名称
print(bs.name)
print(bs.title.name)
# attrs 获取标签节点的属性,返回的是一个 key:value形式的字典,如果某个属性有多个值,返回value就是一个列表
print(bs.a.attrs)
# 获取某一个属性值
print(bs.a['href'])
print(bs.a['id'])
# 有多个属性值,获取到的是列表
print(bs.a['class'])
print(type(bs.a['class']))
print('----------------------------------------')

print(bs.a.string)
# 3.bs4.element.NavigableString  类型 节点之间的text文本
print(type(bs.a.string))

# bs4 是将html代码转换为一个python对象(BeautifulSoup)
# Tag:指的是html中的一个标签(包含开始标签和结束标签在内的整个标签) name,attrs,string
# NavigableString:指的就是标签中的文字,不包含标签

# contents获取直接子节点,返回的是一个列表
print(bs.contents)
print(bs.head.contents)
print(bs.body.contents)

# 根据索引从所有节点中取出某一个
title = bs.head.contents[3]
print(title.string)

# children返回的是一个列表生成器对象
res = bs.head.children
# print(res)
# for循环遍历子节点   ele 就是子节点
for ele in res:
    print(ele)

# descendants获取子孙节点(包含子节点,子节点的子节点,每个子节点的内容),返回的结果是一个生成器对象
print(bs.body.descendants)
res = bs.body.descendants
for ele in res:
    print(ele)

# 获取子节点的父节点
print(bs.title.parent)
print('===================================')
# next_sibling获取节点的下一个兄弟节点
print(bs.meta.next_sibling.next_sibling)

#  previous_sibling获取节点的上一个兄弟节点
print(bs.title.previous_sibling.previous_sibling)


# 搜索文档中的数据
# 直接通过标签名 查找标签
res = bs.find_all('p')
print(res)

#可以同时根据多个标签名查找标签
res = bs.find_all(['a', 'p', 'title'])
print(res)

# find()函数 查找唯一标签
print(bs.find(id='top'))
# find_all()
# 通过class类名查找,不能直接写class,因为class是python关键字  使用class_代替class
print(bs.find_all(class_='two'))

# 2.通过css选择器查找标签,返回的是列表,列表中存放的是查找到的标签
print(bs.select('#data'))
print(bs.select('#web span'))
print(bs.select('.two'))

# 找到指定标签 指定属性值
print(bs.select('a[target="_blank"]'))

# 找到某个标签下的 指定属性值的标签
print(bs.select('div .spider'))
print(bs.select('.spider'))

'''
    图片下载,使用bs4解析数据,并且将图片下载进行分类存放
'''


运行结果:

bs4_lxml的基本用法(不同于正则和xpath)_第1张图片

bs4_lxml的基本用法(不同于正则和xpath)_第2张图片



你可能感兴趣的:(bs4_lxml的基本用法(不同于正则和xpath))