0

HTML エンティティを値として持つノードを検索できませんでした。

私はこのHTMLフラグメントを持っています:

require 'nokogiri'

DATA = "<p>A paragraph <ul><li>Item 1</li><li>&#8853;</li><li>Mango</li></ul></p>"

doc = Nokogiri::HTML(DATA)

p doc.xpath('//li[contains(text(), "Man")]') => This returns a NodeSet
p doc.xpath('//li[contains(text(), "8853")]') => This returns 'Nil'

2 番目のステートメントが NIL を返す理由とその修正方法がわかりません。

4

1 に答える 1

7

Nokogiri がドキュメントを解析するとき、エンティティをデコードしようとするため、デコードされた値を探す必要があります。

require 'nokogiri'

data = "<p>A paragraph <ul><li>Item 1</li><li>&#8853;</li><li>Mango</li></ul></p>"

doc = Nokogiri::HTML(data)

p doc.search('li').map(&:text)
=> ["Item 1", "⊕", "Mango"]

HTML エンティティが実際の文字にデコードされていることに注意してください。

puts doc.to_html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>A paragraph </p>
<ul>
<li>Item 1</li>
<li>⊕&lt;/li>
<li>Mango</li>
</ul>
</body></html>

再び、エンティティがデコードされます。

p doc.xpath('//li[contains(text(), "⊕")]')
=> [#<Nokogiri::XML::Element:0x3fcd78d5f16c name="li" children=[#<Nokogiri::XML::Text:0x3fcd78d5ef64 "⊕">]>]
于 2013-02-15T12:52:11.463 に答える