2

我的示例字符串在此处列出。我想将每个值结果拆分为数组或散列以处理每个元素的值。

<div id="test">
           accno:          123232323 <br>
           id:            5443534534534 <br>
           name:            test_name <br>
           url:                  www.google.com <br>

 </div>

我如何获取散列或数组中的每个值。

4

2 回答 2

4

使用正则表达式很容易:

s = '<div id="test">
           accno:          123232323 <br>
           id:            5443534534534 <br>
           name:            test_name <br>
           url:                  www.google.com <br>

 </div>'

 p s.scan(/\s+(.*?)\:\s+(.*?)<br>/).map.with_object({}) { |i, h| h[i[0].to_sym] = i[1].strip }

或者你可以精确你的键(accno、id、name、url),比如([a-z]+)它们只包含小写字母:

 p s.scan(/\s+([a-z]+)\:\s+(.*?)<br>/).map.with_object({}) { |i, h| h[i[0].to_sym] = i[1].strip }

结果:

 {:accno=>"123232323", :id=>"5443534534534", :name=>"test_name", :url=>"www.google.com"}

更新

的情况下:

<div id="test"> accno: 123232323 id: 5443534534534 name: test_name url: www.google.com </div>

正则表达式将是:

 /([a-z]+)\:\s*(.*?)\s+/

([a-z]+)- 这是哈希键,它可以包含-or _,然后像这样添加它:([a-z]+\-_)。该方案假定在键之后:(可能带有空格),然后是一些文本直到空格。或者(\s+|<)如果行结束没有空格,则在最后:url: www.google.com</div>

于 2014-05-08T08:08:23.980 回答
1

如果您正在处理 html,请使用 html/xml 解析器(如nokogiri<div> )使用CSS 选择器提取所需标记的文本内容。然后将文本解析为字段。

要安装 nokogiri:

gem install nokogiri

然后处理页面和文本:

require "nokogiri"
require "open-uri"

# re matches: spaces (word) colon spaces (anything) space
re_fields  = /\s+(?<field>\w+):\s+(?<data>.*?)\s/

# Somewhere to store the results
record = {}

page      = Nokogiri::HTML( open("http://example.com/divtest.html") )

# Select the text from <div id=test> and scan into fields with the regex 
page.css( "div#test" ).text.scan( re_fields ){ |field, data|
    record[ field ] = data
}
p record

结果是:

{"accno"=>"123232323", "id"=>"5443534534534", "name"=>"test_name", "url"=>"www.google.com"}

如果您正在处理多个元素,也可以将page.css( "blah" )选择器作为数组访问,可以使用.each

# Somewhere to store the results
records    = []

# Select the text from <div id=test> and scan into fields with the regex 
page.css( "div#test" ).each{ |div| 
    record = {}
    div.text.scan( re_fields ){ |field, data|
        record[field] = data
    }
    records.push record
}
p records
于 2014-05-08T09:06:54.943 回答