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(".title") → class="title" 的元素
  • 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性能解析【教程】