Python爬虫数据解析bs4+xpath实例讲解

1. bs4解析

环境安装:

  • pip install lxml #解析器
  • pip install bs4

bs4解析原理:

  • 实例化一个BeautifulSoup的对象,且将待解析的页面源码数据加载到该对象中
  • 调用BeautifulSoup对象中相关方法或者属性进行标签定位和文本数据的提取

BeautifulSoup对象的实例化:

  • BeautifulSoup(fp,‘lxml’):用来将本地存储的html文档中的数据进行解析
  • BeautifulSoup(page_text,’lxml‘):用来将互联网上请求到的页面源码数据进行解析

标签定位:

  • soup.tagName:只可以定位到第一次出现的tagName标签
  • soup.find(‘tagName’,attrName=‘value’):属性定位
  • soup.find_all:跟find一样用作属性定位,只不过findAll返回的是列表
  • soup.select(‘选择器’):选择器定位
    • 类选择器
    • id选择器
    • 层级选择
      • 大于号:表示一个层级
      • 空格:表示多个层级

取数据:

  • .text:返回的是该标签下所有的文本内容
  • .string:返回的是该标签直系的文本内容

取属性:

  • tag[‘attrName’]

2. bs4实例:爬取站长之家高清日出图片

url:http://sc.chinaz.com/tupian/richutupian.html

需求:

  • 将首页所有图片都爬取下来

首页:
在这里插入图片描述

分析:

站长素材高清图片下载用到了图片懒加载,该方法广泛应用在了一些图片的网站中。

该方法的特点是只有当图片被显示在浏览器可视化范围之内才会将img的伪属性变成真正的属性。如果是requests发起的请求,requests请求是没有可视化范围,因此我们一定要解析的是img伪属性的属性值(图片地址)。

真正的属性:src
在这里插入图片描述
伪属性(需要解析的):src2
在这里插入图片描述

程序代码:

import requests
import os
from bs4 import BeautifulSoup

dirName = '日出图片'
if not os.path.exists(dirName):
    os.mkdir(dirName)

url = 'http://sc.chinaz.com/tupian/richutupian.html'
headers = {
    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
r = requests.get(url=url, headers=headers)
r.encoding = r.apparent_encoding
page_text = r.text
soup = BeautifulSoup(page_text, 'lxml')
img_list = soup.select('div > div > a > img')
for img in img_list:
    title = img['alt'] + '.jpg'
    img_url = img['src2']
    img_data = requests.get(url=img_url, headers=headers).content
    img_path = dirName + '/' + title
    with open(img_path, 'wb') as fp:
        fp.write(img_data)
    print(title, '保存成功!')

运行结果:

在这里插入图片描述

3. xpath解析

环境安装:

  • pip install lxml

解析原理:html标签是以树状的形式进行展示

  • 实例化一个etree的对象,且将待解析的页面源码数据加载到该对象中
  • 调用etree对象的xpath方法结合着不同的xpath表达式实现标签的定位和数据提取

实例化etree对象:

  • etree.parse(‘filename’):将本地html文档加载到该对象中
  • etree.HTML(page_text):网站获取的页面数据加载到该对象

标签定位:

  • 最左侧的/:如果xpath表达式最左侧是以/开头则表示该xpath表达式一定要从根标签开始定位指定标签(忽略)
  • 非最左侧的/:表示一个层级
  • 非左侧的//:表示多个层级
  • 最左侧的//:xpath表达式可以从任意位置进行标签定位
  • 属性定位:tagName[@attrName=“value”]
  • 索引定位:tag[index]:索引是从1开始
  • 模糊匹配:
    • //div[contains(@class, “ng”)]
    • //div[starts-with(@class, “ta”)]

取文本:

  • /text():直系文本内容
  • //text():所有的文本内容

取属性:

  • /@attrName

4. xpath实例:爬取站长之家简历模板

url:http://sc.chinaz.com/jianli/free.html

需求:

  • 将首页中每一个模板的压缩包都下载下来
  • 总共爬取前5页的模板

首页:
在这里插入图片描述
详情页:
在这里插入图片描述

分析:

从首页中解析出简历名称和详情页的url,从详情页中解析出下载地址,向这个链接发起请求,获取响应的content即为模板的压缩包,对其做持久化存储。

程序代码:

import requests
import os
from lxml import etree

dirName = '简历模板'
if not os.path.exists(dirName):
    os.mkdir(dirName)

url = 'http://sc.chinaz.com/jianli/free_%d.html'
headers = {
    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
for page in range(1, 5):
    if page == 1:
        new_url = 'http://sc.chinaz.com/jianli/free.html'
    else:
        new_url = format(url, page)
    r = requests.get(url=new_url, headers=headers)
    r.encoding = r.apparent_encoding
    page_text = r.text
    tree = etree.HTML(page_text)
    a_list = tree.xpath('//div[@id="main"]//div/a')
    for a in a_list:
        title = a.xpath('./img/@alt')[0] + '.zip'
        detail_url = a.xpath('./@href')[0]
        r = requests.get(url=detail_url, headers=headers)
        r.encoding = r.apparent_encoding
        page_text_detail = r.text
        tree = etree.HTML(page_text_detail)
        zip_url = tree.xpath('//ul[@class="clearfix"]/li[4]/a/@href')[0]
        zip_data = requests.get(url=zip_url, headers=headers).content
        zip_path = dirName + '/' + title
        with open(zip_path, 'wb') as fp:
            fp.write(zip_data)
        print(title, '保存成功!')

运行结果:

在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫中的bs4xpath是两种常用的数据提取工具。 bs4(Beautiful Soup 4)是一个基于Python的库,用于解析HTML和XML文档。它能够帮助我们从网页中提取数据并进行处理。bs4提供了一些简单且易于使用的方法,例如通过标签名、类名、属性等进行查找和筛选数据。 下面是一个简单的使用bs4进行数据提取的例子: ```python from bs4 import BeautifulSoup import requests # 发送HTTP请求获取页面内容 url = "http://example.com" response = requests.get(url) html_content = response.content # 使用bs4解析页面内容 soup = BeautifulSoup(html_content, 'html.parser') # 提取数据 title = soup.title.text print("网页标题:", title) # 查找某个标签并获取其文本内容 h1 = soup.find("h1") print("h1标签内容:", h1.text) # 查找所有的链接并输出链接文本和URL links = soup.find_all("a") for link in links: print("链接文本:", link.text) print("链接URL:", link["href"]) ``` 另一方面,XPath是一种用于选择XML文档中节点的语言。在爬虫中,我们可以使用XPath来从HTML或XML文档中提取数据XPath提供了强大且灵活的选择器,可以使用路径表达式来定位节点。 下面是一个使用XPath进行数据提取的示例: ```python import requests from lxml import etree # 发送HTTP请求获取页面内容 url = "http://example.com" response = requests.get(url) html_content = response.content # 使用lxml解析页面内容 tree = etree.HTML(html_content) # 提取数据 title = tree.xpath("//title/text()")[0] print("网页标题:", title) # 查找某个标签并获取其文本内容 h1 = tree.xpath("//h1/text()")[0] print("h1标签内容:", h1) # 查找所有的链接并输出链接文本和URL links = tree.xpath("//a") for link in links: link_text = link.xpath("text()")[0] link_url = link.xpath("@href")[0] print("链接文本:", link_text) print("链接URL:", link_url) ``` 以上就是使用bs4XPath进行数据提取的示例代码。希望能帮助到你!如有需要,请随时追问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值