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

