我想使用Nokogiri从HTML字符串中提取下面的所有网址。
<td width="101" style="background: url(https://www.someurl.com/images/images.jpg) no-repeat top left #f9f9f9; text-align:center;">
结果应为
["https://www.someurl.com/images/images.jpg"]
答案 0 :(得分:1)
doc.css('td[style]').map { |n|
n["style"][/background:[^};]*\burl\s*\(\s*(.*?)(?<!\\)\s*\)/, 1]
}.compact
说明:
td
属性style
元素
nil
结果(即正则表达式失败的结果)正则表达式有点时髦,但基本上是:
background:
然后查找任何内容,因为这会结束规则url(...)
但不是更大词的一部分,因此\b
词边界它仍然无法处理引用网址的情况(url("http://example.com")
);它应该捕获整个事物,连同引号,所以你必须自己剥离它们(或者再玩一点regexp)。
答案 1 :(得分:0)
如果目标仅在具有style
参数的表格单元格中,则很容易:
require 'nokogiri'
html = '<td width="101" style="background: url(https://www.someurl.com/images/images.jpg) no-repeat top left #f9f9f9; text-align:center;">'
doc = Nokogiri::HTML(html)
doc.search('td[style*="url("]').map{ |td|
td['style'][/url\((.+?)\)/, 1]
} # => ["https://www.someurl.com/images/images.jpg"]
如果它包含style
参数包含url
的任何标记,则对CSS选择器进行微小更改:'*[style*="url("]'
。如果它在几个特定的标签中,那么它仍然可行,但我会把它留给你去弄清楚。