【问题标题】:Nokogiri: How to select the value of an attribute that contains periods in its id?Nokogiri:如何选择在其 id 中包含句点的属性的值?
【发布时间】:2014-10-01 23:40:02
【问题描述】:

我已经与 Nokogiri 合作了几天,我非常喜欢它。一切都运行良好,直到我需要抓取一个使用 data-reactid javascript 属性标签的网站。问题是 Nokogiri 似乎对这个网站使用的属性 id 格式感到困惑(几个句点、一些美元符号和一些其他无效的 xml/css 字符):

我需要抓取的一个例子是:

<td data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1">94.280</td>

我需要属性内的值 (94.280),其 id 为“.3.3.1:$contract_23.$=1$dataRow:0.1”

通常在 nokogiri 中,我们会通过执行以下操作来选择:

doc.css("type[attributename=attributeid]")

在我的例子中是:

doc.css("td[data-reactid=.3.3.1:$contract_23.$=1$dataRow:0.1]")

但无论我做什么来转义无效字符,它总是告诉我等号后面有一个无效字符:

上面代码的错误信息:

nokogiri-1.4.3.1/lib/nokogiri/css/parser.rb:78:in `on_error': unexpected '.3' after 'equal'

我试过了:

a) 将我的字符串定义为变量并强制转换为字符串

b) 用反斜杠转义 (.3.[...])

c) 用哈希作为前缀 (#.3.3[...])

d) 使用 cgi escapedString 转义它

e) 将其放在 '%{ }' 中,例如 '%{.3.3[...]}'

无论我做什么,我都会收到相同的消息(除了选项 e,它给了我一个完全不同的错误消息:

: no .<digit> floating literal anymore; put 0 before dot

你们能帮我用这样一个名字奇怪的属性获得正确的值吗?

【问题讨论】:

    标签: ruby web-scraping nokogiri


    【解决方案1】:

    您没有展示如何解析文档,但如果我将其解析为 HTML,然后在 css 选择器中的属性值周围使用单引号,我可以获得标签:

    require 'nokogiri'
    
    html = <<END_OF_HTML
    <td data-reactid="hello">10</td>
    <td data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1">94.280</td>
    <td data-reactid="goodbye">20</td>
    END_OF_HTML
    
    html_doc = Nokogiri::HTML(html)
    
    html_doc.css("td[data-reactid='.3.3.1:$contract_23.$=1$dataRow:0.1']").each do |tag|
      puts tag.text
    end
    
    
    --output:--
    94.280
    

    通过这篇 SO 帖子查看 Mothereffing Unquoted Attribute Value Validator:

    CSS attribute selectors: The rules on quotes (", ' or none?)

    【讨论】:

    • 哇,真快!非常感谢!我使用 HTML 作为解析器,您的方法确实有效!双引号内的单引号的魔力!这是一种享受!
    • @Antonio,不客气。请注意,当您想将某些内容插入字符串时使用双引号,例如planet = "earth"; puts "hello #{planet}" 因为你不需要在你的 css 选择器中插入任何东西,所以在外面使用单引号,在里面使用双引号实际上会更有意义:'td[data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1"]' 并且里面的双引号有一定的与 html 中使用的双引号匹配对称。
    • @Antonio,至于%q{}%Q{},它们不能在字符串中使用,但你可以这样做:%q{td[data-reactid=".3.3.1:$contract_23.$=1$dataRow:0.1"]} 但是没有理由使用@987654328 @(或%Q{})在使用单引号时更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2012-04-17
    • 2013-04-09
    • 2021-06-08
    相关资源
    最近更新 更多