240
我爱毛绒绒~~~~~~~

爬虫 - 网页解析库

BeautifulSoup

BeautifulSoup 是一个Python库,用于从 HTML 提取数据

它提供了简单而灵活的方式来遍历和搜索文档树,以及解析和提取所需的数据

安装

BeautifulSoup的安装涉及第三方的扩展

pip3 install beautifulsoup4

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml

pip install lxml

基本使用

from bs4 import BeautifulSoup
import requests


url = 'https://www.cnblogs.com'
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
res = requests.get(url=url,headers=header)
soup = BeautifulSoup(res.text,'lxml')
show = soup.prettify() #处理好缩进,结构化显示
print(show)    

遍历文档树

遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个

soup为上文获取的网页解析对象

  • soup.标签名:获取标签对象

  • soup.标签名.name:获取标签的名称

  • soup.标签名.attrs获取标签的属性

  • 获取标签的内容

    • soup.标签名.string:某标签下的文本只有一个时,取到,否则为None

    • soup.标签名.strings:拿到一个生成器对象, 取到某标签下所有的文本内容

    • soup.标签名.text:取到某标签下所有的文本内容

    • soup.标签名.stripped_strings:去掉空白

  • 嵌套选择

  • 子节点、子孙节点

    • soup.标签名.contents:某标签下所有子节点

    • soup.标签名.children:得到一个迭代器,包含某标签下所有子节点

  • 父节点、祖先节点

    • soup.标签名.parent:获取父节点

    • soup.标签名.parents:获取父节点的父节点,生成器

搜索文档树

find 和 find_all

两者的唯一区别是:find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果

  • name:搜索name参数的值可以使任一类型的 过滤器

  • keyword:key=value的形式,value可以是过滤器:字符串 , 正则表达式,列表, True

    注意class是关键字,所以要加_

  • 按照类名查找
    查找class = post-meta-item 的span标签

  • limit:find_all限制条数
    查找class = post-meta-item 的span标签,输出两条结果

五种过滤器
  • 字符串:即标签名

  • 正则表达式

  • 列表
    如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>标签和<p>标签:

  • True
    可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点

CSS选择器

暂不赘述

Xpath

from lxml import etree

XPath 是一门在 XML 文档中查找信息的语言

import requests
from lxml import etree

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
url = 'https://www.cnblogs.com'
res = requests.get(url=url,headers=header)
html = etree.HTML(res.text)

节点

  • 所有节点

  • 指定节点(结果为列表)

  • 子节点,子孙节点

  • 父节点

属性匹配

  • 文本获取

  • 属性获取

表达式 含义
nodename 选取此层级节点下的所有子节点
/ 代表从根节点进行选取
// 可以理解为匹配,就是在所有节点中选取此节点,直到匹配为止
. 选取当前节点
选取当前节点上一层(上一级目录)
@ 选取属性(也是匹配)
posted @ 2024-07-09 16:29  水开白  阅读(5)  评论(0编辑  收藏  举报