我有这样的东西:
<div class="new-faceout p13nimp" id="purchase_B005ZVWBGK" data-asin="B005ZVWBGK" data-ref="pd_sim_hg_1">
我正在废弃这样的数据:
product_product = @data.css('#purchaseShvl')
product_product.css('.shoveler-cell').each do | product_product |
product_product_asin = product_product.xpath('.//div[@class="new-faceout"]')
(等...)
如何提取data-asin
和data-ref
?
我试过了:
product_product_asin = product_product.xpath('.//div[@class="new-faceout"]/@data-ref').first.value
但该值返回nil
。
答案 0 :(得分:2)
使用Nokogiri::XML::Node#attr
方法获取属性:
>> prd = product_product.at_css('.new-faceout')
>> prd.attr('data-asin')
=> "B005ZVWBGK"
>> prd.attr('data-ref')
=> "pd_sim_hg_1"
您还可以使用Nokogiri::XML::Node#[]
:
>> prd['data-asin']
=> "B005ZVWBGK"
>> prd['data-ref']
=> "pd_sim_hg_1"
答案 1 :(得分:0)
使用XPath指定HTML类有点棘手。在这种情况下,您不能只使用[@class="new-faceout"]
,因为class
属性的实际值为new-faceout p13nimp
,因此它不匹配。你需要使用这样的东西:
[contains(concat(' ', @class, ' '), ' new-faceout ')]
作为条件。 Stack Overflow上有很多关于此问题的问题,以及网络上的其他问题。
使用Nokogiri,您可以结合使用css和XPath来生成更简单的技术,首先使用CSS获取节点,然后使用XPath,例如
。@data.at_css('.new-faceout').at_xpath('./@data-ref')
或者,如果您使用CSS获取节点,则可以使用Nokogiri方法attribute
(或attr
或仅[]
直接获取属性值:
@data.at_css('.new-faceout')['data-ref']