2016-10-06 2 views
0

Я хочу извлечь текст после первого <br> (State).Как извлечь текст после <br> с помощью Mechanize

HTML-код:

<div class="location"> 
    Country 
    <br> 
    State 
    <br> 
    City 
</div> 

В настоящее время я могу извлечь все <div> текст:

a = Mechanize.new 
page = a.get(url) 
state = page.at('.location').text 
puts state 

Любые идеи?

+0

Можете ли вы дать мне URL-адрес сайта? –

ответ

2

Это легко, но вам нужно понять, как документ представлен внутри 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"] 
+0

Это работает, но, например, если я палочку, чтобы выбрать город, я не могу сделать так: 'doc.at ('. Location br br). Next_sibling.text' или' doc.at ('. Location br ') .next_sibling.next_sibling.text' – Rubyx

+0

@Rubyx, какой URL-адрес сайта вам нужен? –

+0

@ Santosh url [щелкните здесь] (http://annonces-immobilier.vivastreet.com/achat-vente-maison+poitiers-86000/poitiers-ganterie-maison-ann-e-1930-sh-80m2-jardin- гараж/140181742). 'Класс есть .kiwii-no-link-color' – Rubyx

1

Попробуйте следовать.

a = Mechanize.new 
page = a.get(url) 
state = page.search(".kiwii-no-link-color").children[2].text 
puts state