Ruby中的Regex用于表示图像的URL

Ruby中的Regex用于表示图像的URL,ruby,regex,Ruby,Regex,所以我正在开发一个爬虫程序,在一个页面上获取一堆图片,这些图片被保存为链接。目前,相关代码为: def parse_html(html) html_doc = Nokogiri::HTML(html) nodes = html_doc.xpath("//a[@href]") nodes.inject([]) do |uris, node| uris << node.attr('href').strip end.uniq end 诚然,我从其他人那里得到了那个

所以我正在开发一个爬虫程序,在一个页面上获取一堆图片,这些图片被保存为链接。目前,相关代码为:

def parse_html(html)
  html_doc = Nokogiri::HTML(html)
  nodes = html_doc.xpath("//a[@href]")
  nodes.inject([]) do |uris, node|
    uris << node.attr('href').strip
  end.uniq
end

诚然,我从其他人那里得到了那个正则表达式,并试图编辑它以使其工作,但我失败了。我遇到的一个大问题是,我使用的原始正则表达式中有几个“#”字符,我不知道这是否是一个我可以转义的字符,或者Ruby是否会在这一点上停止阅读。非常感谢你的帮助

Regexp是一个非常强大的工具,但与简单的字符串比较相比,它的速度非常慢

对于您的简单示例,我建议使用以下简单条件:

IMAGE_EXTS = %w[gif jpg png]
if IMAGE_EXTS.any? { |ext| uri.end_with?(ext) }
  # ...
在问题的上下文中,您可能希望将方法更改为:

IMAGE_EXTS = %w[gif jpg png]

def parse_html(html)
  uris = []

  Nokogiri::HTML(html).xpath("//a[@href]").each do |node|
    uri = node.attr('href').strip
    uris << uri if IMAGE_EXTS.any? { |ext| uri.end_with?(ext) }
  end

  uris.uniq
end
IMAGE\u EXTS=%w[gif jpg png]
def解析_html(html)
URI=[]
Nokogiri::HTML(HTML).xpath(“//a[@href]”)。每个do |节点|
uri=node.attr('href').strip

uriRegexp是一个非常强大的工具,但是与简单的字符串比较相比,它们的速度非常慢

对于您的简单示例,我建议使用以下简单条件:

IMAGE_EXTS = %w[gif jpg png]
if IMAGE_EXTS.any? { |ext| uri.end_with?(ext) }
  # ...
在问题的上下文中,您可能希望将方法更改为:

IMAGE_EXTS = %w[gif jpg png]

def parse_html(html)
  uris = []

  Nokogiri::HTML(html).xpath("//a[@href]").each do |node|
    uri = node.attr('href').strip
    uris << uri if IMAGE_EXTS.any? { |ext| uri.end_with?(ext) }
  end

  uris.uniq
end
IMAGE\u EXTS=%w[gif jpg png]
def解析_html(html)
URI=[]
Nokogiri::HTML(HTML).xpath(“//a[@href]”)。每个do |节点|
uri=node.attr('href').strip

我会考虑修改你的XPath来包括你的逻辑。例如,如果您只需要包含
img
a
元素,则可以使用以下选项:

"//a[img][@href]"
或者更进一步,直接从
href
值中提取URI:

uris = html_doc.xpath("//a[img]/@href").map(&:value)

我会考虑修改你的XPath来包括你的逻辑。例如,如果您只需要包含
img
a
元素,则可以使用以下选项:

"//a[img][@href]"
或者更进一步,直接从
href
值中提取URI:

uris = html_doc.xpath("//a[img]/@href").map(&:value)

正如一些人所说,您可能不想为此使用正则表达式,但如果您决心:

^http(s?):\/\/.*\.(jpeg|jpg|gif|png)

是一个非常简单的方法,它可以抓取以http或https开头并以列出的文件扩展名之一结尾的任何内容。您应该能够找到如何扩展此功能的方法,Rubular.com非常适合尝试这些功能。

正如一些人所说,您可能不想使用正则表达式来实现此功能,但如果您决定:

^http(s?):\/\/.*\.(jpeg|jpg|gif|png)

是一个非常简单的方法,它可以抓取以http或https开头并以列出的文件扩展名之一结尾的任何内容。您应该能够了解如何扩展此功能,Rubular.com非常适合尝试这些功能。

一如既往,
jpe?g
是实现此功能的方法,但也使用了
/i
不区分大小写的标志。尝试编辑它以使其正常工作,但我失败了。。。这是什么意思?错误消息?还有别的吗?您显示的regex命令没有意义。在Ruby中,可以使用
string.match(pattern)
string
将是一个Ruby字符串,
pattern
将是一个正则表达式<代码>节点
正如您所展示的,它是一个Xpath。潜伏者,也许这将是我在这里展示我的新特性,但我认为Xpath是一个包含URL的字符串。潜伏者,当我说我试图编辑它以使其工作时,我失败了,控制台返回了一条错误消息,期望关键字_do或{仅供参考:您误用了
inject
,它应该是一个
map
uris=nodes.map{| node | node.attr('href').strip}
。一如既往,
jpe?g
是实现这一点的方法,但也使用了
/i
不区分大小写的标志。试图编辑它以使其正常工作,但我失败了…这意味着什么?错误消息?其他什么?您显示的regex命令没有意义。在Ruby中,您将使用
string.match(模式)
string
将是一个Ruby字符串,
pattern
将是一个正则表达式。
节点
正如您所示,它是一个Xpath。潜伏者,也许这将是我在这里展示我的新特性,但我认为Xpath是一个包含URL的字符串。潜伏者,当我说我试图编辑它以使其工作,但失败时,控制台返回了一个错误期望关键字_do或{FYI:您误用
inject
,它应该是
map
uris=nodes.map{node | node.attr('href').strip}
。我试图将您的代码复制粘贴到我的程序中,但它仍然下载了所有内容。是否需要其他语法?我试图将您的代码复制粘贴到我的程序中,但它仍然下载了所有内容。是否需要其他语法?