从HTML中的td字段中提取URL

时间:2014-09-02 08:50:04

标签: ruby nokogiri

我想使用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"]

2 个答案:

答案 0 :(得分:1)

doc.css('td[style]').map { |n|
  n["style"][/background:[^};]*\burl\s*\(\s*(.*?)(?<!\\)\s*\)/, 1]
}.compact

说明:

  • 挑选出td属性
  • 的所有style元素
  • 对于每一个,尝试通过采用regexp的第一个捕获组
  • 来提取url
  • 消除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("]'。如果它在几个特定的​​标签中,那么它仍然可行,但我会把它留给你去弄清楚。