Python爬虫技术 第13节 HTML和CSS选择器

在爬虫技术中,解析和提取网页数据是核心部分。HTML 和 CSS 选择器被广泛用于定位网页中的特定元素。下面将详细介绍这些选择器如何在 Python 中使用,特别是在使用像 Beautiful Soup 或 Scrapy 这样的库时。

在这里插入图片描述

HTML 选择器

HTML 选择器基于 HTML 元素的属性来定位和选择页面上的元素。以下是一些常见的 HTML 选择器类型:

  1. 标签选择器

    • soup.find_all('div') 将返回页面上所有的 <div> 标签。
  2. 类选择器

    • soup.find_all(class_='classname') 可以找到所有 class 属性为 classname 的元素。
  3. ID 选择器

    • soup.find(id='uniqueid') 可以找到 ID 为 uniqueid 的元素。
  4. 属性选择器

    • soup.find_all(attrs={'data-type': 'value'}) 可以找到具有指定属性和值的所有元素。
  5. 组合选择器

    • soup.select('div p') 使用 CSS 选择器语法来查找所有位于 <div> 内部的 <p> 标签。

CSS 选择器

CSS 选择器提供了更复杂的选择能力,它们可以基于元素的关系、位置和状态来选择元素。以下是 CSS 选择器的一些示例:

  1. 子选择器

    • #parent > .child 只选择直接作为 #parent 子元素的 child 类元素。
  2. 后代选择器

    • .container .item 选择所有在 .container 类内的 .item 类元素,无论嵌套多深。
  3. 相邻兄弟选择器

    • h1 + p 选择紧跟在 h1 元素后的 p 元素。
  4. 一般兄弟选择器

    • h1 ~ p 选择同级的 h1 元素之后的所有 p 元素。
  5. 伪类选择器

    • a:hover 选择鼠标悬停状态下的链接。

在 Python 中,Beautiful Soup 库使用 .select() 方法来解析 CSS 选择器,而 Scrapy 提供了 .css() 方法来实现类似功能。

示例代码

使用 Beautiful Soup:

from bs4 import BeautifulSoup
import requestsresponse = requests.get('http://example.com')
soup = BeautifulSoup(response.text, 'html.parser')# 使用标签选择器
divs = soup.find_all('div')# 使用类选择器
classname_elements = soup.find_all(class_='classname')# 使用 CSS 选择器
container_items = soup.select('.container .item')

使用 Scrapy:

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'start_urls = ['http://example.com']def parse(self, response):divs = response.css('div')classname_elements = response.css('.classname')container_items = response.css('.container .item')

以上就是使用 HTML 和 CSS 选择器在 Python 爬虫中抓取数据的基本方法。根据实际需求,你可以结合多种选择器来精确地定位和提取所需信息。

当然,让我们通过一些具体的例子来更深入地探讨如何在Python中使用Beautiful Soup和Scrapy结合HTML和CSS选择器来提取网页数据。

使用 Beautiful Soup 的例子

假设我们要从一个网站上抓取所有文章标题和作者信息,我们可以这样做:

from bs4 import BeautifulSoup
import requestsdef fetch_data(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 假设标题在 <h2> 标签内,并且有 class "title"titles = [tag.text for tag in soup.find_all('h2', class_='title')]# 假设作者信息在 <span> 标签内,并且有 class "author"authors = [tag.text for tag in soup.find_all('span', class_='author')]return titles, authorsurl = 'http://example.com/articles'
titles, authors = fetch_data(url)print("Titles:", titles)
print("Authors:", authors)

使用 Scrapy 的例子

Scrapy 是一个更强大的框架,它允许异步请求和更复杂的爬虫逻辑。以下是一个简单的Scrapy爬虫的例子:

import scrapyclass ArticleSpider(scrapy.Spider):name = 'article_spider'start_urls = ['http://example.com/articles']def parse(self, response):# 使用 CSS 选择器来获取文章标题titles = response.css('h2.title::text').getall()# 获取作者信息authors = response.css('span.author::text').getall()# 遍历每一篇文章for title, author in zip(titles, authors):yield {'title': title,'author': author}

为了运行这个Scrapy爬虫,你需要在你的项目目录下创建一个与你的爬虫名称匹配的文件夹(例如 article_spider),并在其中创建一个 spiders 文件夹。然后在 spiders 文件夹里创建一个以你的爬虫名字命名的.py文件(例如 article_spider.py),并把上面的代码放进去。

处理分页和更复杂的数据结构

如果网站有分页,你可能需要在Scrapy中使用回调函数来处理每个页面。例如:

class ArticleSpider(scrapy.Spider):name = 'article_spider'start_urls = ['http://example.com/articles/page/1']def parse(self, response):# ... 提取文章标题和作者的代码 ...# 获取下一页的链接next_page = response.css('a.next-page::attr(href)').get()if next_page is not None:yield response.follow(next_page, self.parse)

在这个例子中,response.follow 方法会发送一个新的请求到 next_page URL,并调用 self.parse 函数处理响应。

以上就是使用Beautiful Soup和Scrapy结合HTML和CSS选择器进行数据抓取的基本示例。在实际应用中,你可能需要根据目标网站的具体HTML结构调整选择器。

在之前的代码基础上,我们可以进一步扩展功能,比如处理异常、增加日志记录以及优化数据存储。下面的示例将展示如何在 Beautiful Soup 和 Scrapy 中实现这些功能:

使用 Beautiful Soup 添加异常处理和日志记录

import logging
import requests
from bs4 import BeautifulSouplogging.basicConfig(level=logging.INFO)def fetch_data(url):try:response = requests.get(url)response.raise_for_status()  # Raises an HTTPError if the HTTP request returned an unsuccessful status codesoup = BeautifulSoup(response.text, 'html.parser')titles = [tag.text for tag in soup.find_all('h2', class_='title')]authors = [tag.text for tag in soup.find_all('span', class_='author')]logging.info(f"Fetched {len(titles)} articles from {url}")return titles, authorsexcept requests.exceptions.RequestException as e:logging.error(f"Error fetching data from {url}: {e}")return [], []url = 'http://example.com/articles'
titles, authors = fetch_data(url)if titles and authors:print("Titles:", titles)print("Authors:", authors)
else:logging.warning("No data fetched.")

在 Scrapy 中添加数据存储到 CSV 文件

在 Scrapy 中,你可以使用内置的 FeedExporter 来保存数据到不同的格式,如 JSON 或 CSV。以下是如何设置 Scrapy 项目以保存数据到 CSV 文件:

  1. 在你的 Scrapy 项目的 settings.py 文件中,添加以下配置:
FEEDS = {'articles.csv': {'format': 'csv'},
}

这将告诉 Scrapy 把输出保存到名为 articles.csv 的 CSV 文件中。

  1. 确保你的爬虫代码正确生成字典,并在 yield 中返回:
class ArticleSpider(scrapy.Spider):name = 'article_spider'start_urls = ['http://example.com/articles']def parse(self, response):titles = response.css('h2.title::text').getall()authors = response.css('span.author::text').getall()for title, author in zip(titles, authors):yield {'title': title,'author': author}
  1. 当你运行 Scrapy 爬虫时,它将自动将数据写入 articles.csv 文件。

处理更复杂的数据结构

如果数据结构非常复杂,可能需要多次解析或使用递归。例如,如果文章的详细信息在另一个页面上,你可以使用 Scrapy 的 follow 方法来访问和解析详情页面:

class ArticleSpider(scrapy.Spider):name = 'article_spider'start_urls = ['http://example.com/articles']def parse(self, response):article_links = response.css('a.article-link::attr(href)').getall()for link in article_links:yield response.follow(link, self.parse_article)def parse_article(self, response):title = response.css('h1.article-title::text').get()content = response.css('div.article-content *::text').getall()yield {'title': title,'content': content}

这样,你就可以更全面地处理和存储网络上的数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384418.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业公户验证API如何使用JAVA、Python、PHP语言进行应用

在纷繁复杂的金融与商业领域&#xff0c;确保每笔交易的安全与合规是至关重要的。而企业公户验证API&#xff0c;正是这样一位默默守护的数字卫士&#xff0c;它通过智能化的手段&#xff0c;简化了企业对公账户验证流程&#xff0c;让繁琐的审核变得快捷且可靠。 什么是企业公…

ShadingModel一些分析

一、算法分级 二、DFGTexture 用拟合替换DFGTexture&#xff08;Ref&#xff1a;Cod-Black Ops II&#xff09; 优点&#xff1a;节省一张纹理的采样。 缺点&#xff1a; 1、效果上会变得暗一些&#xff0c;并且由于用拟合的原因&#xff0c;会多一点指令计算。 2、后续如…

《Milvus Cloud向量数据库指南》——BGE-M3:多功能、多语言、多粒度的文本表示学习模型

引言 在自然语言处理(NLP)领域,随着大数据时代的到来,对文本信息的精准处理与高效检索成为了研究热点。BERT(Bidirectional Encoder Representations from Transformers)作为近年来NLP领域的里程碑式模型,以其强大的上下文理解能力在多项任务中取得了显著成效。然而,面…

Android APP 音视频(01)MediaCodec解码H264码流

说明&#xff1a; 此MediaCodec解码H264实操主要针对Android12.0系统。通过读取sd卡上的H264码流Me获取视频数据&#xff0c;将数据通过mediacodec解码输出到surfaceview上。 1 H264码流和MediaCodec解码简介 1.1 H264码流简介 H.264&#xff0c;也被称为MPEG-4 AVC&#xff…

【Linux】一些基本指令

文章目录 前言Linux下基本指令Linux下一些常见的通配符Linux下的引号引用whoamiwholswhichaliaswhereisfindtouchmkdirrmdir & rmmancpmvcatmorelessheadtailechodatecalgrepzip & unziptarrz & szuname几个重要的热键关机 前言 在学习操作系统的时候&#xff0c;我…

Dav_笔记12:Automatic SQL Tuning 之 1 概述

自动调整优化器概述 Oracle数据库使用优化程序为已提交的SQL语句生成执行计划。优化器以以下模式运行&#xff1a; ■普通模式 优化器编译SQL并生成执行计划。正常模式为绝大多数SQL语句生成合理的计划。在正常模式下&#xff0c;优化器以非常严格的时间约束运行&#xff0c…

Python 高阶语法

前言&#xff1a; 我们通过上篇文章学习了Python的基础语法&#xff0c;接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性&#xff1a;  封装  继承 …

Oracle系统表空间的加解密

实验环境 数据库选择的是orclpdb1&#xff0c;当前系统表空间未加密&#xff1a; SQL> show con_nameCON_NAME ------------------------------ ORCLPDB1SQL> select TABLESPACE_NAME, STATUS, ENCRYPTED from dba_tablespaces;TABLESPACE_NAME STATUS …

软件测试:Postman 工具的使用。开发及测试均需要掌握的测试工具

工具介绍 各个模块功能的介绍如下&#xff1a; 1、New&#xff1a;在这里创建新的请求、集合或环境&#xff1b;还可以创建更高级的文档、Mock Server 和 Monitor以及API。 2、Import&#xff1a;这用于导入集合或环境。有一些选项&#xff0c;例如从文件&#xff0c;文件夹导…

【Linux】远程连接Linux虚拟机(MobaXterm)

【Linux】远程连接Linux虚拟机&#xff08;MobaXterm&#xff09; 零、原因 有时候我们在虚拟机中操作Linux不太方便&#xff0c;比如不能复制粘贴&#xff0c;不能传文件等等&#xff0c;我们在主机上使用远程连接软件远程连接Linux虚拟机后可以解决上面的问题。 壹、软件下…

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili &#xff08;b站上有一系列课&#xff0c;从数据处理到模型构建和训练使用&#xff09; 什么是batch&#xff1f; 为什么一个batch内的句子要一样长&#xff1f; 不同batch的长度可以不一样&#xff0c;但是同一个batch内长度一样&#xff01;…

回文子串转二维dp的方式

目录 写在最前&#xff1a; 1. 首先我们要考虑一个问题&#xff1a;如何判断一个字符串是回文子串 2.如何创建dp[i][j]表示回文子串 3. 如何初始化&#xff1f; 4. 如何实现 问题引入&#xff1a; LCR 020. 回文子串 给定一个字符串 s &#xff0c;请计算这个字符串中有…

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范&#xff1a; 1.写一个类MessageInfo对象&#xff0c;添加构造方法 虽然有快捷键&#xff0c;但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库&#xff0c;通过添加注…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

项目实战1(30小时精通C++和外挂实战)

项目实战1&#xff08;30小时精通C和外挂实战&#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂&#xff0c;首先要将界面…

【SpringCloud】 微服务分布式环境下的事务问题,seata大合集

目录 微服务分布式环境下的事务问题 分布式事务 本地事务 BASE理论与强弱一致性 BASE理论 强弱一致性 常见分布式事务解决方案 - 2PC 常见分布式事务解决方案 - TCC 常见分布式事务解决方案 - 最大努力通知 常见分布式事务解决方案 - 最终一致性 Seata介绍与术语 Seata…

学习测试10-4自动化 web自动化

网页资源 链接: https://pan.baidu.com/s/17XL2c2lkw_R6BD–VnOQqw?pwd43dr 提取码: 43dr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 框架之间切换 driver.switch_to.frame("idframe1") # 父切子 参数用id和name# 子切子必须先转回父 driver.sw…

【OpenCV C++20 学习笔记】操作图片

操作图片 概述图片的导入和保存对导入的图片的操作获取像素值Point类型和图片像素 内存管理和引用计数一些简便操作图片可视化更精确的类型转换 概述 在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例&#xff08;《图片处理基础》&#xff09;&#xff0c;这篇文章…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

实战解读:Llama Guard 3 Prompt Guard

前序研究&#xff1a;实战解读&#xff1a;Llama 3 安全性对抗分析 近日&#xff0c;腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚&#xff0c;随着Llama3.1的发布&#xff0c;Meta正式提出了“Llama系统”的概念&#xff0c;通过系统级的安全组件对…