3.零基础系统学习Python爬虫之BeautifulSoup的简单使用

在这里插入图片描述


Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。通过Beautiful Soup库,我们可以将指定的class或id值作为参数,来直接获取到对应标签的相关数据,这样的处理方式简洁明了。

BeautifulSoup

BeautifulSoup安装的安装

通过命令安装 Beautiful Soup pip install beautifulsoup4

BeautifulSoup库常用指令即使用方法

# 从bs4中导入BeautifulSoup
from bs4 import BeautifulSoup

文档美化,格式化输出网页源码
soup.prettify()

打印第一个标签
soup.p    注意只打印了第一个,其他的不进行打印

soup.head.name    获取head标签的名称

soup.a.attrs            获取a标签中的所有属性
soup.p.text             自动将标签框架去掉 
soup.html.head      嵌套式选择

打开子节点
soup.body.children   body所有子节点,返回的是迭代器对象
list(soup.body.children)    将子节点强转成列表类型
soup.body.descendants   子孙节点

打开父亲节点
soup.p.parent    获取p标签的父亲节点
soup.p.parents  获取p标签所有的祖先节点
list(soup.p.parents)
# 找下一个兄弟
print(soup.p.next_sibling)

# 找上一个兄弟
print(soup.a.previous_sibling)  # 找到第一个a标签的上一个兄弟节点
找到a标签上面的所有兄弟节点
print(soup.a.previous_siblings)  # 返回的是生成器
print(list(soup.a.previous_siblings))


find搜索文档树
soup.find(name='p')   根据文本p查找某个标签
soup.find_all(name='p')  找到所有标签名为p的节点
soup.find(attrs={"class": "sister"})   查找第一个class为sister的节点
text = soup.find(text="$37")
soup.find(name="a", attrs={"id": "link2"}, text="Lacie")  找到一个id为link2、文本为Lacie的a标签
soup.find(name=re.compile('p'))   正则过滤器
soup.find_all(name=['p', 'a', re.compile('html')])  列表过滤器
 
 soup.find(name='p', attrs={"id": True})    找到有id的p标签

以上即为常用的指令,如有不理解的可自行百度,使用比较简单就不在赘述。

BeautifulSoup使用方法(步骤)

from  bs4 import  BeautifulSoup
from urllib.request import  urlopen #导入打开网页的库函数
# 调用BeautifulSoup实例化得到一个soup对象
# 参数一: 解析文本
# 参数二: 解析器(html.parser、lxml...)

#首先打开网页,这里需要先导入urlopen模块
html = urlopen("http://www.chinanews.com/")

#使用BeautifulSoup解析网页, 
# 参数一: 需要解析的文本,即为上面打开的网页源码
# 参数二: 解析器(html.parser、lxml...)
soup = BeautifulSoup(html, 'lxml')

#接下来直接使用指令进行打印操作
#例如:
#格式化输出源码
print(soup.prettify())

# 4、获取标签的内容
print(soup.a.text)


#其他指令用法相同,大家可自行推广

BeautifulSoup库的编译器

编译器 使用方法 条件
bs4d的HTML解析器 BeautifulSoup(mk,“html.parser”) 安装bs4
lxml的HTML解析器 BeautifulSoup(mk,“lxml”) pip install lxml
lxml的XML解析器 BeautifulSoup(mk,“xml”) pip install lxml
html5lib解析器 BeautifulSoup(mk,“html5lib”) pip install html5lib

以上是BeautifulSoup最基本的使用方法,希望大家能够掌握以上步骤。

BeautifulSoup使用技巧

只打印文字,去除框架

#直接打印li类
month = soup.find_all("li")
print(month)

#处理后只打印文字,去除格式符号
month = soup.find_all('li', {"class": "month"})
for m in month:
    print(m.get_text())  #get_text()得到文字

获取某个标签下的另一个标签里面的内容

content = data.find("td", class_="postbody").text
name = data.find("div", class_="auth").text

使用lxml+xpath提取内容

XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。
下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中节点,从而不考虑节点的位置
. 选取当前节点的父节点
@ 选取属性

 
bsObj = BeautifulSoup(html, "html.parser")
images = bsObj.findAll("img", {"src":re.compile("\.\/page3_files\/img.*\.jpg")})
for image in images: 
    print(image["src"])
#这个正则表达式的意思是,寻找所有./page3_files/img开头以.jpg结尾的图片。
  1. 将html文档解析成文档树,返回bs对象
  2. 通过get_text()函数返回文档除链接、标签、段落外的文本内容
  3. find函数和findAll函数通过标签和属性过滤html页面,标签可以多个,属性是字典类型,自然可以多值
  4. 3中的两个函数当通过keyword参数过滤时,如果key为class,则需写为class_=“green”
  5. bs对象可以直接调用子标签来返回,但这种方式灵活性不大,当页面结构发生些许改变后,可能会导致爬虫程序不能正确返回结果。
  6. 子代标签就是父标签的下一级,而后代标签是父标签下所有级别的标签
    可以处理兄弟标签,向前处理或者向后处理,返回的列表不包括自身对象
    为了让爬虫更稳定,最好还是让标签的选择更加的具体。

以上即为本文的全部内容,希望对你的学习有所帮助。
在这里插入图片描述

发布了40 篇原创文章 · 获赞 42 · 访问量 5934

猜你喜欢

转载自blog.csdn.net/qq_45172832/article/details/104220842