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}
。我试图将您的代码复制粘贴到我的程序中,但它仍然下载了所有内容。是否需要其他语法?我试图将您的代码复制粘贴到我的程序中,但它仍然下载了所有内容。是否需要其他语法?