Получить элемент за другим элементы с Hpricot и Ruby - PullRequest
0 голосов
/ 29 мая 2011

У меня есть следующий HTML-код:

<ul class="filtering_new" width="50%">
     <li class="filter">1</li>
     <li class="filter">2</li>
     <script>Alert('1');</script>
     <li class="filter">3</li>
</ul>

Как я могу получить li с inner_html = 3?

Я пытался так:

page.search("//ul.filtering_new").each do |list|
     puts list.search("li").size  
end

где page - это HTML-документ.

size = 2, но должно быть 3.

Я пытался сделать то же самое в руководстве https://github.com/hpricot/hpricot/wiki/hpricot-challenge, но даже не могу найти <script.

 list.search("script")

ничего не возвращает.

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Я не думаю, что вы можете смешивать XPath с CSS Selector при использовании search. В вашем примере вы делаете. Попробуйте:

 //ul[@class='filtering_new']

или

ul.filtering_new

внутри search.

0 голосов
/ 29 мая 2011

Большинство парсеров XML / HTML в Ruby в наши дни используют Nokogiri, поэтому я рекомендую этот парсер. Тем не менее, Hpricot и Nokogiri поддерживают XPath и CSS, поэтому они довольно взаимозаменяемы.

Я бы пошел по этому пути:

html = <<EOT
<ul class="filtering_new" width="50%">
     <li class="filter">1</li>
     <li class="filter">2</li>
     <script>Alert('1');</script>
     <li class="filter">3</li>
</ul>
EOT

require 'nokogiri'

doc = Nokogiri::HTML(html)
li = doc.search('//li[@class="filter"]').select{ |n| n.text.to_i == 3 } 
li # => [#<Nokogiri::XML::Element:0x8053fc84 name="li" attributes=[#<Nokogiri::XML::Attr:0x8053fb6c name="class" value="filter">] children=[#<Nokogiri::XML::Text:0x80546f98 "3">]>]

Это находит подходящие узлы, затем возвращает их как NodeSet для повторения, где они выбираются / отклоняются на основе текста узла.

li = doc.search('//li[text() = "3"]') 
li # => [#<Nokogiri::XML::Element:0x8053fc84 name="li" attributes=[#<Nokogiri::XML::Attr:0x8053fb6c name="class" value="filter">] children=[#<Nokogiri::XML::Text:0x80546f98 "3">]>]

Это значительно облегчает сравнение с базовой библиотекой libXML, где она работает намного быстрее.

...