извлечь все родители из документа с Nokogiri - PullRequest
1 голос
/ 03 августа 2011

У меня есть такой документ:

<DL><a lot of tags>...<H3>Entry 1</H3><a lot of tags>...</DL>
<DL><a lot of tags>...<H3>Entry 2</H3><a lot of tags>...
    <DL><a lot of tags>...<H3>Entry 21</H3><a lot of tags>...
        <DL><a lot of tags>...<H3>Entry 211</H3><a lot of tags>...</DL>
    </DL>
</DL>
<DL><a lot of tags>...><H3>Entry 3</H3><a lot of tags>...</DL>

Я хочу найти все записи '', и это легко с помощью следующего кода:

@doc=Nokogiri::HTML(@file)
@doc.css('DL>h3').each do |node| puts node.text end

как мне извлечь списокH3 родителей для каких-либо записей?Я хотел бы иметь метод в качестве «родителя», который возвращает отношение, например: entry211.parent ==> / Entry 2 / Entry 21 /

1 Ответ

1 голос
/ 03 августа 2011

Если вы просто хотите, чтобы родительский элемент каждого h3 элемента

@doc.css('DL>h3').collect(&:parent)

должен сделать трюк.

Однако, похоже, вам могут понадобиться все элементы h3, которые являются потомками элемента dl, который является предком элемента h3. Если я правильно понял это и вашу структуру, вы сможете сделать

@doc.css('dl>h3').collect { |h3| h3.ancestors('dl').css('h3') }

Это дает вам Array, содержащий Array с элементами h3, которые являются потомками dl элементов в каждом h3 элементе происхождения. Смущенный? Я уверен, что:)

Например, используя ваш пример HTML, результат для Entry 211 h3 будет

@doc.css('dl>h3').collect { |h3| h3.ancestors('dl').css('h3') }[3].collect(&:text)
#=> ["Entry 211", "Entry 21", "Entry 2"]

Это достаточно близко к тому, что вы хотите?

...