Ruby Nokogiri库怎么解析HTML和XML
发布时间 - 2026-01-01 00:00:00 点击率:次Nokogiri 是 Ruby 中基于 libxml2 的高性能 HTML/XML 解析库,支持 CSS 选择器与 XPath;用 Nokogiri::HTML 解析容错 HTML,Nokogiri::XML 解析严格 XML;推荐优先使用 css/at_css 提取元素,XPath 适用于复杂定位;注意编码转换以防中文乱码。
Nokogiri 是 Ruby 中最成熟、最常用的 HTML/XML 解析库,它底层基于 libxml2(和 libxslt),速度快、稳定性高,支持 CSS 选择器和 XPath,语法简洁直观。
加载 HTML 或 XML 文档
用 Nokogiri::HTML 解析 HTML(自动修复不规范标签),用 Nokogiri::XML 解析严格 XML(遇到格式错误会报错):
doc = Nokogiri::HTML(html_string)doc = Nokogiri::HTML(File.open("page.html"))doc = Nokogiri::XML(xml_string)doc = Nokogiri::XML(File.read("data.xml"))
如果不确定输入是否严格合规,又想解析 XML 内容,可用 Nokogiri::HTML.fragment 提取片段,或加选项 strict: false 容错。
用 CSS 选择器提取元素
这是最常用的方式,写法接近前端开发习惯:
-
doc.css("h1")→ 所有元素
-
doc.css(".titl→ class="title" 的元素
e") -
doc.css("div#main a[href]")→ main div 内带 href 的链接 -
doc.at_css("meta[name='description']")→ 第一个匹配元素(返回 Node,不是 NodeSet)
注意:css 返回 Nokogiri::XML::NodeSet(可遍历的集合),at_css 返回单个 Node 或 nil,适合取标题、摘要等唯一内容。
用 XPath 提取更复杂结构
XPath 更强大,适合嵌套定位、条件判断、位置索引等:
-
doc.xpath("//ul[@class='nav']/li[1]/a/text()")→ 导航栏第一个链接文字 -
doc.xpath("//*[contains(@class, 'price')]")→ class 含 price 的任意元素 -
doc.at_xpath("//img/@src")&.value→ 第一张图片的 src 属性值
XPath 表达式里属性用 @attr,文本内容用 text(),注意返回的是 NodeSet,取值需调用 .text、.[] 或 &.value 等方法。
读取属性、文本与修改内容
拿到 Node 后,常用操作包括:
-
node.text→ 去除标签的纯文本(含子节点文本) -
node.content→ 同text,但不合并空白 -
node['href']或node.attr("href")→ 读取属性 -
node.set_attribute("class", "new-class")→ 修改属性 -
node.inner_html = "new"→ 替换内部 HTML -
node.remove→ 删除该节点
批量处理时,通常配合 each 遍历 NodeSet,例如:doc.css("script").remove 可一键清除所有 script 标签。
不复杂但容易忽略:Nokogiri 默认使用 UTF-8 编码,若源文档是 GBK、Shift-JIS 等,需先转码再解析,否则中文可能乱码。可用 string.encode!("UTF-8", "GBK", invalid: :replace) 预处理。
# css
# html
# 前端
# node
# 编码
# 前端开发
# 中文乱码
# ai
# ruby
# String
# xml
# class
# nil
# href
# 选择器
# ul
# li
# 第一个
# 遍历
# 最常用
# 的是
# 这是
# 文档
# 适用于
# 不确定
# 速度快
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Linux安全能力提升路径_长期防护思维说明【指导】
详解jQuery中的事件
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel如何使用Service Container和依赖注入?(代码示例)
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
网站优化排名时,需要考虑哪些问题呢?
如何在Windows服务器上快速搭建网站?
Python高阶函数应用_函数作为参数说明【指导】
如何在IIS中新建站点并解决端口绑定冲突?
高防服务器租用指南:配置选择与快速部署攻略
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何在阿里云服务器自主搭建网站?
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何创建自定义Artisan命令?(代码示例)
如何登录建站主机?访问步骤全解析
高端企业智能建站程序:SEO优化与响应式模板定制开发
WEB开发之注册页面验证码倒计时代码的实现
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
如何续费美橙建站之星域名及服务?
浅析上传头像示例及其注意事项
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel如何实现一对一模型关联?(Eloquent示例)
如何快速搭建FTP站点实现文件共享?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
如何快速查询域名建站关键信息?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
canvas 画布在主流浏览器中的尺寸限制详细介绍
如何在云主机上快速搭建网站?
企业网站制作这些问题要关注
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Android自定义listview布局实现上拉加载下拉刷新功能
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Java解压缩zip - 解压缩多个文件或文件夹实例
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Python文件流缓冲机制_IO性能解析【教程】


e")