You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby爬虫读取日文触发URI::InvalidURIError问题求助

解决Ruby爬虫中URI包含非ASCII字符的报错问题

嘿,这个问题我之前也碰到过!你的报错根源很明确:URI标准要求必须是纯ASCII编码,但你当前的URL里直接包含了日文(比如\u4FDD\u967A对应的“保全”),所以触发了URI::InvalidURIError。下面给你两种靠谱的解决方式:

方法一:用URI.encode_www_form构建完整查询(推荐)

这是最稳妥的做法,它会自动帮你处理所有参数的URL编码,包括非ASCII字符。你可以把参数放到哈希里,再生成合法的URL:

require 'uri'
require 'rexml/document'

# 基础URL和参数哈希
base_url = "https://www.google.com/complete/search"
params = {
  h1: "ja",
  output: "toolbar",
  q: "保全" # 这里直接写你的日文查询内容
}

# 编码所有参数并拼接成完整URL
encoded_params = URI.encode_www_form(params)
full_url = "#{base_url}?#{encoded_params}"

# 之后正常读取和解析即可
doc = REXML::Document.new(open(full_url).read.encode("UTF-8"))

执行后,q参数里的日文会被自动转成%E4%BF%9D%E5%85%A8这种ASCII编码的格式,完全符合URI要求。

方法二:单独编码查询参数

如果你的URL结构比较固定,只想单独编码q参数的内容,可以用URI.encode_www_form_component:

require 'uri'
require 'rexml/document'

query_text = "保全"
# 单独编码查询内容
encoded_query = URI.encode_www_form_component(query_text)
# 拼接成合法URL
url = "https://www.google.com/complete/search?h1=ja&output=toolbar&q=#{encoded_query}"

doc = REXML::Document.new(open(url).read.encode("UTF-8"))

避坑提醒

别用已经过时的URI.escape了,Ruby 2.5+里这个方法已经被标记为废弃,官方推荐用上面两种encode_www_form相关的方法,它们更符合URL编码的标准规范。

内容的提问来源于stack exchange,提问作者jadejoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:53