Python网页正文提取神器: readability库详解

Python网页正文提取神器: readability库详解

    • 1. readability简介
    • 2. 安装
    • 3. 基本使用
      • 3.1 提取文章内容
      • 3.2 获取元数据
    • 4. 高级功能
      • 4.1 自定义选项
      • 4.2 处理非标准HTML
    • 5. 实际应用示例
      • 5.1 批量提取新闻文章
      • 5.2 创建简单的阅读模式
    • 6. 性能优化
    • 7. 注意事项和局限性
    • 8. 总结

在网络爬虫和数据分析领域,我们经常需要从HTML页面中提取主要内容,去除广告、导航栏等无关元素。readability是一个强大的Python库,专门用于从HTML中提取文章的主要内容和元数据。本文将详细介绍readability库的使用方法和基本概念。

1. readability简介

readability-lxml是Mozilla开发的Readability.js的Python移植版本。它使用启发式算法来识别和提取网页中的主要内容,同时去除广告、侧边栏等干扰元素。

主要特点:

  • 从HTML中提取文章正文
  • 识别文章标题、作者、发布日期等元数据
  • 支持多种语言
  • 可以处理不规范的HTML

2. 安装

使用pip安装readability-lxml:

pip install readability-lxml

3. 基本使用

3.1 提取文章内容

from readability import Document
import requests# 获取网页内容
url = "https://example.com/article"
response = requests.get(url)
html_content = response.text# 创建Document对象
doc = Document(html_content)# 获取文章标题
title = doc.title()# 获取文章正文
content = doc.summary()print(f"标题: {title}")
print("正文:")
print(content)

3.2 获取元数据

# 获取文章短标题
short_title = doc.short_title()# 获取文章描述
description = doc.description()print(f"短标题: {short_title}")
print(f"描述: {description}")

4. 高级功能

4.1 自定义选项

readability允许你自定义一些参数来调整提取算法:

from readability import Documentoptions = {'min_text_length': 100,  # 最小文本长度'retry_length': 250,     # 重试时的最小长度'char_threshold': 500,   # 字符阈值'keep_classes': [],      # 保留的CSS类名'clean_conditionally': True,  # 是否进行条件清理'remove_empty_nodes': True,   # 是否移除空节点
}doc = Document(html_content, **options)
content = doc.summary()

4.2 处理非标准HTML

readability能够处理一些不太规范的HTML:

from readability import Document# 处理缺少closing tags的HTML
html = "<html><body><p>This is a paragraph<p>This is another paragraph</body></html>"
doc = Document(html)
content = doc.summary()
print(content)

5. 实际应用示例

5.1 批量提取新闻文章

import requests
from readability import Document
import csvdef extract_article(url):response = requests.get(url)doc = Document(response.text)return {'title': doc.title(),'content': doc.summary(),'url': url}urls = ["https://example.com/news1","https://example.com/news2","https://example.com/news3"
]articles = [extract_article(url) for url in urls]# 将结果保存到CSV文件
with open('articles.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.DictWriter(file, fieldnames=['title', 'content', 'url'])writer.writeheader()writer.writerows(articles)

5.2 创建简单的阅读模式

from flask import Flask, request, render_template_string
from readability import Document
import requestsapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])
def reader_mode():if request.method == 'POST':url = request.form['url']response = requests.get(url)doc = Document(response.text)title = doc.title()content = doc.summary()return render_template_string("""<h1>{{ title }}</h1>{{ content|safe }}""", title=title, content=content)return '''<form method="post">URL: <input type="text" name="url"><input type="submit" value="Read"></form>'''if __name__ == '__main__':app.run(debug=True)

6. 性能优化

对于大量网页的处理,可以考虑以下优化策略:

  1. 使用异步请求库如aiohttp来并发获取网页内容
  2. 使用多进程处理大量文章
  3. 将提取的内容缓存到数据库中,避免重复处理
import asyncio
import aiohttp
from readability import Document
from concurrent.futures import ProcessPoolExecutorasync def fetch(url, session):async with session.get(url) as response:return await response.text()def process_html(html):doc = Document(html)return doc.summary()async def extract_articles(urls):async with aiohttp.ClientSession() as session:html_contents = await asyncio.gather(*[fetch(url, session) for url in urls])with ProcessPoolExecutor() as executor:results = list(executor.map(process_html, html_contents))return resultsurls = ["https://example.com/article1", "https://example.com/article2", ...]
results = asyncio.run(extract_articles(urls))

7. 注意事项和局限性

  1. readability主要针对文章类型的网页,对于复杂的布局可能效果不佳。
  2. 某些动态加载的内容可能无法提取,需要结合其他技术如Selenium。
  3. 版权问题: 使用readability提取内容时要注意遵守网站的使用条款和版权法。
  4. 不同网站可能需要微调参数以获得最佳效果。

8. 总结

readability库为Python开发者提供了一个强大的工具,用于从HTML中提取文章的主要内容。它在网络爬虫、数据分析、内容聚合等场景中非常有用。

通过使用readability,我们可以:

  • 快速提取网页中的主要文章内容
  • 去除广告、导航栏等无关元素
  • 获取文章标题、作者等元数据
  • 创建阅读模式或内容聚合应用

虽然readability有一些限制,但对于大多数常见的文章提取任务来说,它已经足够强大和灵活。通过结合其他Python库(如requests、BeautifulSoup等),我们可以创建更加复杂和强大的网页内容提取系统。

在实际项目中,readability可以大大简化从网页中提取有用信息的过程,提高数据处理的效率。

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

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

相关文章

【高精度实验】PFA具塞试管 四氟塞子 实验室分析专用

PFA具塞试管&#xff0c;以其四氟塞子的卓越密封性能&#xff0c;为实验室的精确度和安全性提供了双重保障。以下是针对PFA具塞试管的营销文案&#xff0c;特别强调其四氟塞子的特性&#xff1a; 【四氟密封&#xff0c;科研无忧】 在追求极致精确的科研世界里&#xff0c;PF…

上海市计算机学会竞赛平台2023年3月月赛丙组循环播放

题目描述 又是一年春暖花开&#xff0c;小爱与家人一起开车出游&#xff0c;在漫长的路途上&#xff0c;他开始播放自己的歌单以舒缓疲劳。 小爱的歌单中有&#x1d45b;n首歌&#xff0c;其中第 &#x1d456;i 首歌的时长为 &#x1d461;&#x1d456;ti​ 分钟&#xff0…

安华金和—可信数据空间助力公共数据授权运营安全有序开展的实践探索

伴随数字化、网络化和智能化的快速发展&#xff0c;数字经济与实体经济深度融合&#xff0c;数据已然成为经济发展赖以依托的基础性、战略性资源&#xff0c;对社会生产、分配、流通、消费和社会服务管理等各环节产生深刻影响。我国高度重视数字经济发展&#xff0c;将数据列入…

Linux安全加固:防火墙规则与SELinux策略

Linux系统的安全加固是一个多层面的过程&#xff0c;其中防火墙规则与SELinux策略是两个至关重要的方面&#xff0c;它们共同为系统提供了网络和本地级别的安全保障。 防火墙规则&#xff08;FirewallD/Iptables&#xff09; Firewalld • 简介&#xff1a;Firewalld是Linux…

理解 React 中的 API 封装、自定义 Hooks、组件、独立模块与 Context

在现代前端开发中&#xff0c;React 提供了多种方法来组织和管理代码。这些方法包括 API 封装、自定义 Hooks、组件、独立模块和 Context。理解它们的区别和联系&#xff0c;可以帮助我们编写更清晰、更模块化的代码。 1. API 封装 目的&#xff1a;处理与后端服务的通信逻辑…

14-21 人工智能的历史以及简单神经网络的工作原理

初始 “我们需要走得更深”这句台词出自电影《盗梦空间》。这是在讨论深入梦境更深层次时说的&#xff0c;暗示需要探索梦境的更深层次。虽然这似乎是不可能的&#xff0c;但它传达的理念是&#xff0c;要创造一个新的世界&#xff0c;就必须冒险进入更深的层次。 电影《盗梦空…

将List切割为多个指定长度的多个List

参考: https://blog.csdn.net/baidu_41480640/article/details/122507018https://blog.csdn.net/H1767410/article/details/138333350https://blog.51cto.com/u_16213352/7632003https://blog.csdn.net/2301_82243396/article/details/137900249 手写1 private List<List&l…

3D问界—MAYA中冻结变化的作用以及应用的场景

问题提出&#xff1a;MAYA中冻结变化的作用以及应用的场景 在Maya中&#xff0c;“冻结变换”&#xff08;Freeze Transformations&#xff09;的作用是重置对象的变换属性&#xff0c;包括平移、旋转和缩放&#xff0c;将它们归零或者设定为特定的值。这通常在以下几个步骤中需…

unity强力配置插件Luban【Next最新版本】(二)本地化

文章目录 前言一、快速实现静态本地化1、表格格式2、本地化文本3、修改bat文件3、打表 二、多语言切换1、修改bat文件2、增加本地化管理脚本3、测试 总结 前言 无需多言&#xff0c;本地化&#xff08;Localization&#xff0c;简称 L10N&#xff09;是指将产品、内容或服务适…

软考的报名详细流程

2024年软考的考试时间已经公布&#xff0c;分别为5月25日至28日和11月9日至12日。准备参加2024年软考的朋友们&#xff0c;一定要提前关注官方发布的考试安排。 本文将详细介绍软考报考的整个流程。准备报考的朋友们&#xff0c;阅读本文就足够啦&#xff01;软考的报考流程大致…

如何系列 如何确保Kafka消息可靠性/防止消息丢失

文章目录 ProducerBrokerConsumer流程 从Kafka架构来看&#xff0c;理论上仍有消息丢失的可能性&#xff0c;但实际发生的概率极低&#xff0c;只有在所有副本的机器都宕机时才会丢失。 当所有代理&#xff08;broker&#xff09;都确认消息时&#xff0c;这并不意味着消息已经…

【CT】LeetCode手撕—1143. 最长公共子序列

目录 题目1- 思路2- 实现⭐1143. 最长公共子序列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;1143. 最长公共子序列 1- 思路 模式识别&#xff1a;最长公共子序列——> 动规五部曲 2- 实现 ⭐1143. 最长公共子序列——题解思路 class Solution {public int longe…

2024上半年网络工程师考试《应用技术》试题一

阅读以下说明&#xff0c;回答问题。 【说明】 MPLS基于(1)进行转发&#xff0c;进行MPLS标签交换和报文转发的网络设备称为(2)&#xff0c;构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时&#xf…

LLM4Decompile——专门用于反编译的大规模语言模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.05286 反编译是一种将已编译的机器语言或字节码转换回原始高级编程语言的技术。该技术用于分析软件的内部工作原理&#xff0c;尤其是在没有源代码的情况下&#xff1b;Ghidra 和 IDA Pro 等专用工具已经开发出来&#…

等保2.0 实施方案

一、引言 随着信息技术的广泛应用&#xff0c;网络安全问题日益突出&#xff0c;为确保信息系统安全、稳定、可靠运行&#xff0c;保障国家安全、公共利益和个人信息安全&#xff0c;根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》&#xff08;等保2.0&#x…

实验七 SQL数据更新和视图

题目 &#xff08;1&#xff09;向商品类别表category中插入一条记录&#xff08;801&#xff0c;‘座椅套’&#xff0c;‘各种品牌的汽车座套’&#xff09; &#xff08;2&#xff09;向商品表product中插入一条记录&#xff1a;商品编号80101&#xff0c;商品名称“四季通…

【HDC.2024】探索无限可能:华为云区块链+X,创新融合新篇章

6月23日&#xff0c;华为开发者大会2024&#xff08;HDC 2024&#xff09;期间&#xff0c; “「区块链X」多元行业场景下的创新应用”分论坛在东莞松山湖举行&#xff0c;区块链技术再次成为焦点。本次论坛以"区块链X"为主题&#xff0c;集结了行业专家、技术领袖、…

【Linux】虚拟机安装 openEuler 24.03 X86_64

目录 一、概述 1.1 openEuler 覆盖全场景的创新平台 1.2 系统框架 1.3 平台框架 二、安装详细步骤 一、概述 1.1 openEuler 覆盖全场景的创新平台 openEuler 已支持 x86、Arm、SW64、RISC-V、LoongArch 多处理器架构&#xff0c;逐步扩展 PowerPC 等更多芯片架构支持&…

安装docker版rabbitmq 3.12

本文介绍在Ubuntu22中安装docker版rabbitmq 3.12。 一、拉取镜像 docker pull rabbitmq:3.12.14-management二、创建数据目录和docker-compose文件 创建目录&#xff1a; cd /root mkdir rabbitmq-docker cd rabbitmq-docker mkdir data chmod 777 data创建docker-compose配…

超声波气象站的工作原理

TH-CQX5超声波气象站中的超声波技术是其核心工作原理之一&#xff0c;以下是关于超声波气象站中超声波的详细解释&#xff1a;超声波是一种频率高于人耳能听到的声音频率范围的声波&#xff0c;通常指频率在20kHz以上的声波。超声波具有较短的波长和强的穿透能力&#xff0c;能…