如何使用ruby regex从标签中提取href?

时间:2015-10-20 19:25:15

标签: ruby regex html-parsing

我有这个链接,我声明如下:

class NewApplicationForm(forms.Form):
    id = JobsModelChoiceField(queryset=Job.objects.none(), ...)

...


    def __init__(self, *args, **kwargs):
        super(NewApplicationForm, self).__init__(*args, **kwargs)
        self.fields['id'].queryset = Job.objects.all()

问题是如何使用正则表达式仅提取href值?

谢谢!

3 个答案:

答案 0 :(得分:6)

如果要解析HTML,可以使用Nokogiri gem而不是使用正则表达式。它更容易。

示例:

require "nokogiri"

link = "<a href=\"https://www.congress.gov/bill/93rd-congress/house-bill/11461\">H.R.11461</a>"

link_data = Nokogiri::HTML(link)

href_value = link_data.at_css("a")[:href]

puts href_value # => https://www.congress.gov/bill/93rd-congress/house-bill/11461

答案 1 :(得分:5)

您应该可以使用这样的正则表达式:

href\s*=\s*"([^"]*)"

请参阅该表达式的this Rubular example

捕获组将为您提供URL,例如:

link = "<a href=\"https://www.congress.gov/bill/93rd-congress/house-bill/11461\">H.R.11461</a>"
match = /href\s*=\s*"([^"]*)"/.match(link)
if match
  url = match[1]
end

表达式的说明:

  • href与href属性匹配
  • \s*匹配0个或更多空白字符(这是可选的 - 如果HTML可能不是规范形式,则只需要它。)
  • =匹配等号
  • \s*再次允许使用可选空格
  • "匹配href网址的开头引用
  • (开始一个捕获组,用于提取
  • 中匹配的内容
  • [^"]*匹配0个或更多非引号字符。由于必须对HTML属性中的引号进行转义,因此这将匹配所有字符,直到URL的末尾。
  • )结束捕获组
  • "匹配href属性值
  • 的结束引用

答案 2 :(得分:1)

为了捕获网址,您可以执行此操作:

/(href\s*\=\s*\\\")(.*)(?=\\)/

并使用第二场比赛。

http://rubular.com/r/qcqyPv3Ww3