【问题标题】:Ruby HTML attributes to Hash or ArrayHash 或 Array 的 Ruby HTML 属性
【发布时间】:2014-09-12 01:52:00
【问题描述】:

type="checkbox" name="prdCdList" value="102001174" class="bnone" newfl="Y" cpnfl="N" catcpnfl="N" eventfl="N" catcd1="102000" catcd2= "102001" prdimgl="/upload/product/320_1405497216907.jpg" prdnm="亲爱的我的音量" prdvol="3.4g" prdlndesc="限量粉色" selprc="10000" spsalprc="0" cpnprc="0" cashptrat ="0" cashpt="0" discpt="0" salstatcdnm="可用" salstatcd="PS01" prdwidth="0" prdheight="0" prddepth="0" pricestr="" price="10000" prepromote= "" endpromote=""


我目前正在使用一堆正则表达式将上述数据解析为结构化数组或哈希。 实际标签包含更多值。认为在 Ruby 中必须有更好的方法,比如使用 split 之类的?属性之间有空格,但在某些值内也有空格,所以..

任何人都可以提出一种处理这种类型字符串的好方法吗?

我希望结果是:

hash = { 
 type => "checkbox",
 name => "prdCdList",
... so on.
}

arr = [
 "checkbox",
 "prdCdList",
... so on.
]

不胜感激任何建议 =]

谢谢,

【问题讨论】:

  • 你试过nokogiri.org吗?
  • @UriAgassi 是的,我正在使用它。如果您能让我知道如何使用 Nokogiri 解析值,那就太好了!它们位于一个标签内,因此如果我使用 xpath 或 CSS 选择该标签,它将返回整个标签。我目前正在这样做 + 正则表达式来获取内部值..

标签: html ruby string parsing hash


【解决方案1】:
node.attributes.each_with_object({}) {|(k,v), acc| acc[k] = v.value }

node 是你的标签。

【讨论】:

    【解决方案2】:

    使用 Nokogiri,属性已经为您解析 - 只需使用 [] 访问它们:

    doc = Nokogiri::HTML.parse('<html><body><div type="checkbox" name="prdCdList" value="102001174" class="bnone" newfl="Y" cpnfl="N" catcpnfl="N" eventfl="N" catcd1="102000" catcd2="102001" prdimgl="/upload/product/320_1405497216907.jpg" prdnm="Dear my volume" prdvol="3.4g" prdlndesc="Limited Pink" selprc="10000" spsalprc="0" cpnprc="0" cashptrat="0" cashpt="0" discpt="0" salstatcdnm="Available" salstatcd="PS01" prdwidth="0" prdheight="0" prddepth="0" pricestr="" price="10000" prepromote="" endpromote=""></body></html>')
    div = doc.css('div').first
    div['prdnm']
    # => "Dear my volume" 
    

    来自documentation

    Nokogiri::XML::Node 是您通往充满乐趣的交易世界的窗口 带有 XML 和 HTML 标记。 Nokogiri::XML::Node 可能会被类似对待 到关于属性的哈希。例如(来自 irb):

    01.irb(main):004:0> node
    02.=> <a href="#foo" id="link">link</a>
    03.irb(main):005:0> node['href']
    04.=> "#foo"
    05.irb(main):006:0> node.keys
    06.=> ["href", "id"]
    07.irb(main):007:0> node.values
    08.=> ["#foo", "link"]
    09.irb(main):008:0> node['class'] = 'green'
    10.=> "green"
    11.irb(main):009:0> node
    12.=> <a href="#foo" id="link" class="green">link</a>
    13.irb(main):010:0>
    

    请参阅Nokogiri::XML::Node#[]Nokogiri::XML#[]= 了解更多信息。

    【讨论】:

    • 哇...这太简单了。非常感谢。这似乎是 Nokogiri 的基本功能......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2016-03-24
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多