<br> 在 Rails + Nokogiri 之间检索文本



对于下面的部分HTML,我试图检索文本"进行研究…通过Nokogiri在两个<br>标签之间找到治疗方法。

<b>Multiple Sclerosis National Research Institute</b><br>
<!-- <b>CFC Code: 12135</b><br />     ***** This is edited by Anas -->
<a href="http://www.ms-research.org" target="_blank">http://www.ms-research.org</a><br> 
(866)-676-7400<br> 
Conducts research towards understanding, treating and halting the progression of multiple sclerosis and related diseases. Current research progress is promising. Please help us find cures!<br>
<a href="/ntn/charities/view.aspx?record_id=510">Click here for more info</a><br><br>
到目前为止,我已经能够检索nameurl与此代码:
url = "https://www.neighbortonation.org/ntn/charities/home.aspx"    
doc = Nokogiri::HTML(open(url))
doc.css("#site-pagecontent table table td").each do |item|
    name = item.at_css("b").text unless item.at_css("b").blank?
    url = item.at_css("a")[:href] unless item.at_css("a").blank?
end

但是我在试图检索特定<br>标签之间的文本时卡住了。我试着在
标签与Nokogiri?但这似乎并不奏效。什么好主意吗?我应该使用xpath、搜索还是正则表达式?

在讨论XML中的"元素之间的文本"时,记住XML中的文本保存在一个text节点中是有帮助的。在Nokogiri中,这是Nokogiri::XML::Text实例。

例如,这个HTML:

<p>Hello <b>World</b>!</p>

最简单地表示为:

(Element name:"p" children:[
  (Text content:"Hello ")
  (Element name:"b" children:[
    (Text content:"World")
  ])
  (Text content:"!")
])

<p>元素有三个子节点。通常我们不需要记住这一点,因为我们经常想知道文本是子元素还是后代元素,找到一个元素,然后使用.text方法返回给我们一个字符串。

在您的例子中,您希望找到最可靠的方法来定位附近的元素。让我们假设<a href="...">Click here for more info</a>将始终存在,并且您想要的文本紧接在其前面。

# Find an <a> element with specific text content
info = doc.at_xpath('//a[.="Click here for more info"]')
# Walk back to the previous element, which we assume is an always-present <br>
br   = info.previous_element
# Find the Text node immediately preceding that, and then get its contents
desc = br.previous.text

使用XPath可以更有效、更简洁地完成此操作,但是对于Ruby程序员来说,它变得更难理解:

p doc.at('//a[.="Click here for more info"]/preceding-sibling::text()[1]').text
#=> " nConducts research towards understanding, treating and halting the ...

上面的代码查找锚,然后使用XPath查找前面的所有文本节点,然后只选择第一个文本节点。

这个怎么样:

html = '<b>Multiple Sclerosis National Research Institute</b><br> ...'
doc = Nokogiri::HTML(html)
doc.css('br')[2].next.text.strip
#=> "Conducts research towards understanding, treating and halting the progression of multiple sclerosis and related diseases. Current research progress is promising. Please help us find cures!"

和直播内容:

url = "https://www.neighbortonation.org/ntn/charities/home.aspx"    
doc = Nokogiri::HTML(open(url))
doc.css("#site-pagecontent table table td").each do |item|
  description = item.css('br')[2].next.text.strip unless item.css('br').empty?
  ...
end

相关内容

  • 没有找到相关文章

最新更新