1

对于以下部分 HTML,我正在尝试检索文本“进行研究......找到治疗方法!” <br>通过 Nokogiri 在两个标签之间。

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

到目前为止,我已经能够使用以下代码检索nameand :url

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 在 <br> 标签之间提取的建议?但这似乎不起作用。有任何想法吗?我应该使用 xpath、搜索还是正则表达式?

4

2 回答 2

3

当谈到 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 查找所有前面的文本节点,然后只选择第一个文本节点。

于 2013-01-08T16:03:31.820 回答
2

这个怎么样:

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
于 2013-01-08T05:02:33.290 回答