Ruby 如何在<;之后提取文本;br>;使用机械化

Ruby 如何在<;之后提取文本;br>;使用机械化,ruby,mechanize,Ruby,Mechanize,我想在第一个(状态)之后提取文本 HTML代码是: <div class="location"> Country <br> State <br> City </div> 有什么想法吗 这很简单,但您必须了解文档是如何在DOM中的Nokogiri中表示的 有标记(为元素节点)和中间文本(为文本节点): require 'nokogiri' doc = Nokogiri::HTML(<<EOT)

我想在第一个

(状态)之后提取文本

HTML代码是:

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

有什么想法吗

这很简单,但您必须了解文档是如何在DOM中的Nokogiri中表示的

有标记(为元素节点)和中间文本(为文本节点):

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"
和以下文本节点:

doc.at('.location br').next_sibling.class # => Nokogiri::XML::Text
以及如何访问文本节点的内容:

doc.at('.location br').next_sibling.text # => "\n    State\n    "
再次查看
标记及其下一个同级节点:

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">

我不能这样做
doc.at('.location br').next\u sibling.text
doc.at('.location br').next\u sibling.text

第一个断言是正确的,您不能使用
'。位置br'
,因为您不能在

中嵌套标记,所以在为HTML编写CSS选择器时,
br
毫无意义

第二种说法是错误的。您可以使用
next\u sibling.next\u 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>"
所以,你只是走得不够远:

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"]

这很简单,但您必须理解文档是如何在DOM中的Nokogiri中表示的

有标记(为元素节点)和中间文本(为文本节点):

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"
和以下文本节点:

doc.at('.location br').next_sibling.class # => Nokogiri::XML::Text
以及如何访问文本节点的内容:

doc.at('.location br').next_sibling.text # => "\n    State\n    "
再次查看
标记及其下一个同级节点:

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">

我不能这样做
doc.at('.location br').next\u sibling.text
doc.at('.location br').next\u sibling.text

第一个断言是正确的,您不能使用
'。位置br'
,因为您不能在

中嵌套标记,所以在为HTML编写CSS选择器时,
br
毫无意义

第二种说法是错误的。您可以使用
next\u sibling.next\u 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>"
所以,你只是走得不够远:

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"]
试试下面的

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

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

你能给我一个站点url吗?你能给我一个站点url吗?它是有效的,但例如,如果我想选择一个城市,我就不能这样做
doc.at('.location br')。next齌sibling.text
doc.at('.location br')。next齌sibling.text
@Rubyx你想放弃哪个站点url?@Santosh url是<代码>类是.kiwii没有链接颜色@Rubyx让你检查答案吗?它是有效的,但例如,如果我想选择城市,我不能像这样
doc.at('.location br')。next_sibling.text
doc.at('.location br')。next_sibling.text
@Rubyx你想放弃哪个网站url?@Santosh url是<代码>类为。kiwii无链接颜色@Rubyx你检查答案了吗?