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
相关产品推荐
相关产品推荐

