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

如何在Ruby中从HTML主体提取URL?URI.extract返回空数组求助

解决URI.extract提取meta refresh中URL为空的问题

我之前也碰到过类似的情况,URI.extract默认的匹配规则没法识别这种嵌在meta标签refresh属性值里的URL格式。下面给你几个可行的解决步骤:

步骤1:解析HTML提取meta的content属性

首先用HTML解析库(比如Nokogiri)定位到目标meta标签,拿到它的content值,这比直接正则匹配整个HTML要靠谱得多:

require 'nokogiri'

html = "<html><head><meta http-equiv=refresh content=0;URL=/ref.php?offer_id=350&aff_id=28&url=https%3A%2F%2Fplay.leadzuaf.com%2F%3Fm%3D0ENYJG473721%26offer_key%3D473721%26fc%3D1%26a%3Dy00704Hj50h1zF05XC0HZEp0Kpefss.%7Bpubid%7D%26pubid%3D28&urlauth=ab27ecac97f1760d912ad169b4af1e4b></head></html>"
doc = Nokogiri::HTML(html)
refresh_content = doc.at('meta[@http-equiv="refresh"]')['content']

步骤2:从content中提取目标URL

content值的格式是0;URL=xxx,用正则就能精准提取出URL=后面的部分:

url_match = refresh_content.match(/URL=(.+)/)
target_url = url_match ? url_match[1] : nil
# 此时target_url就是 /ref.php?offer_id=350&aff_id=28&url=https%3A%2F%2Fplay.leadzuaf.com%2F%3Fm%3D0ENYJG473721%26offer_key%3D473721%26fc%3D1%26a%3Dy00704Hj50h1zF05XC0HZEp0Kpefss.%7Bpubid%7D%26pubid%3D28&urlauth=ab27ecac97f1760d912ad169b4af1e4b

步骤3:(可选)提取嵌套的编码URL

如果你的目标是url=参数里的那个编码后的URL,可以用URI工具解码:

require 'uri'

if target_url
  uri = URI.parse(target_url)
  # 解析query参数为哈希
  query_params = URI.decode_www_form(uri.query).to_h
  nested_original_url = query_params['url']
  # 得到 https://play.leadzuaf.com/?m=0ENYJG473721&offer_key=473721&fc=1&a=y00704Hj50h1zF05XC0HZEp0Kpefss.{pubid}&pubid=28
end

为什么URI.extract会返回空数组?

URI.extract默认是寻找独立的、符合URI标准格式的字符串,但你的URL是嵌在meta标签的属性值里,前面还有0;URL=的前缀,不在默认的匹配规则范围内,所以提取不到。如果一定要用URI.extract,可以自定义匹配模式,但这种方式不如先解析HTML精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:25:59