Как исключить вложенный элемент при получении контента с помощью Nokogiri? - PullRequest
3 голосов
/ 13 июля 2011

У меня есть страница с содержимым, похожим на это:

<div id="level1">
    <div id="level2">
        <div id="level3">Crap i dont care about</div>
        Here is some text i want
        <br />
        Here is some more text i want
        <br />
        Oh i want this text too :)
    </div>
</div>

Моя цель - записать текст в #level2, но #level3 <div> вложено в него втот же уровень, что и текст, который я хочу.

Возможно ли как-то исключить это <div>?Должен ли я изменить документ и просто удалить элемент перед анализом?

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Если ваш HTML-фрагмент находится в html, то вы можете сделать что-то вроде этого:

doc = Nokogiri::HTML(html)
div = doc.at_css('#level2')   # Extract <div id="level2">
div.at_css('#level3').remove  # Remove <div id="level3">
text_you_want = div.inner_text

Вы также можете сделать это с XPath, но я считаю, что CSS-селекторы немного проще для простых случаев, подобных этому.

4 голосов
/ 13 июля 2011
require 'nokogiri'

xml = <<-XML
<div id="level1">
    <div id="level2">
        <div id="level3">Crap i dont care about</div>
        Here is some text i want
        <br />
        Here is some more text i want
        <br />
        Oh i want this text too :)
    </div>
</div>
XML

page = Nokogiri::XML(xml)
p page.xpath("//*[@id='level3']").remove.xpath("//*[@id='level2']").inner_text
# => "\n        \n        Here is some text i want\n        \n        Here is some more text i want\n        \n        Oh i want this text too :)\n    "

Теперь вы можете очистить выводимый текст, если хотите.

...