Это легко, но вам нужно понять, как документ представлен внутри Nokogiri в DOM.
Есть теги, которые являются узлами элемента, а промежуточный текст, текстовые узлы:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<div class="location">
Country
<br>
State
<br>
City
</div>
EOT
doc.at('.location br').next_sibling.text.strip # => "State"
Вот что говорит Nokogiri <br>
является:
doc.at('.location br').class # => Nokogiri::XML::Element
И следующий узел Text:
doc.at('.location br').next_sibling.class # => Nokogiri::XML::Text
И как мы получаем доступ к содержимому текстового узла:
doc.at('.location br').next_sibling.text # => "\n State\n "
И снова, глядя на <div>
тег и его следующий родственный узел:
doc.at('.location').class # => Nokogiri::XML::Element
doc.at('.location').next_sibling.class # => Nokogiri::XML::Text
doc.at('.location').next_sibling # => #<Nokogiri::XML::Text:0x3fcf58489c7c "\n">
Кстати, вы можете получить доступ к механизировать в Nokogiri парсер, чтобы играть с DOM, используя что-то вроде:
require 'mechanize'
agent = Mechanize.new
page = agent.get('http://example.com')
doc = page.parser
doc.class # => Nokogiri::HTML::Document
doc.title # => "Example Domain"
Я не могу сделать так doc.at('.location br br').next_sibling.text
или doc.at('.location br').next_sibling.next_sibling.text
Первое утверждение верно, вы не можете использовать '.location br br'
, потому что вы не можете вкладывать тег внутри <br>
, так br br
нонсенс при написании селектор CSS для HTML.
Второе утверждение неверно. Вы можете использовать next_sibling.next_sibling
, но вы должны знать теги в DOM.В вашем HTML примере он ничего толкового не вернуть:
doc.at('.location br').to_html # => "<br>"
doc.at('.location br').next_sibling.to_html # => "\n State\n "
doc.at('.location br').next_sibling.next_sibling.to_html # => "<br>"
И получение text
из <br>
вернет пустую строку, так как <br>
не может обернуть текст:
doc.at('br').text # => ""
Таким образом, вы просто Бесполезный «т достаточно далеко:
doc.at('.location br').next_sibling.next_sibling.next_sibling.text.strip # => "City"
Но, если это намерение с этим DOM Я хотел бы сделать это еще проще:
break_text = doc.search('.location br').map{ |br| br.next_sibling.text.strip }
# => ["State", "City"]
Можете ли вы дать мне URL-адрес сайта? –