0

我正在尝试使用 Hpricot 和 Ruby 解析 HTML 文件,但在提取未包含在<p></p>.

require 'hpricot'

text = <<SOME_TEXT
  <a href="http://www.somelink.com/foo/bar.html">Testing:</a><br />
  line 1<br />  
  line 2<br />
  line 3<br />
  line 4<br />
  line 5<br />
  <b>Here's some more text</b>
SOME_TEXT

parsed = Hpricot(text)

parsed = parsed.search('//a[@href="http://www.somelink.com/foo/bar.html"]').first.following_siblings
puts parsed

我希望结果是

<br />
line 1<br />  
line 2<br />
line 3<br />
line 4<br />
line 5<br />
<b>Here's some more text</b>

但我越来越

<br />
<br />
<br />
<br />
<br />
<br />
<b>Here's some more text</b>

如何使 Hpricot 返回第 1 行、第 2 行等?

4

2 回答 2

1

您的第一步是阅读以下_siblings 文档:

查找跟随当前元素的兄弟元素。像其他“兄弟”方法一样,这会淘汰文本和评论节点

然后你应该使用 Hpricot 源来概括如何following_siblings获得类似following_siblings但不过滤掉非容器节点的东西:

parsed        = Hpricot(text)
link          = parsed.search('//a[@href="http://www.somelink.com/foo/bar.html"]').first
link_sibs     = link.parent.children
what_you_want = link_sibs[link_sibs.index(link) + 1 ... link_sibs.length]

puts what_you_want

这几乎是following_siblingswithparent.children而不是parent.containers。访问您使用的库的源代码非常方便,并且鼓励学习它。

于 2010-12-09T02:46:39.650 回答
0

自从我使用 Hpricot 已经有一段时间了,但我记得有些事情可能会有所帮助:

获取所有文本的快速方法:

irb(main):023:0> print parsed.inner_text
  Testing:
  line 1  
  line 2
  line 3
  line 4
  line 5
  Here's some more text

这样做的缺点是您也可以将文本嵌入标签中。

同样,我们可以搜索所有'text()'节点:

irb(main):033:0> puts (parsed / 'text()')

Testing:

  line 1

  [...]

  line 5

所以,我们可以这样做:

irb(main):036:0> puts (parsed / 'text()')[2 .. -3]

  line 1

  line 2

  line 3

  line 4

  line 5

或者:

irb(main):037:0> (parsed / 'text()')[2 .. -3]
=> #<Hpricot::Elements["\n  line 1", "  \n  line 2", "\n  line 3", "\n  line 4", "\n  line 5", "\n  "]>

或者:

irb(main):039:0> (parsed / 'text()')[2 .. -3].map{ |t| t.inner_text.strip }
=> ["line 1", "line 2", "line 3", "line 4", "line 5", ""]

从网页中获取数据/文本的主要思想是寻找可用于浏览页面的地标。<div>通常我们可以从一个或<p>标签中获取文本。如果页面没有为您提供地标,您必须使用其他技巧;寻找一系列文本节点,然后可能是节点,或者是具有特定属性<br>的标签后面的五行。这就是处理 HTML 的乐趣和挑战。<a>href

在我的脑海中,有一个挥之不去的想法,即有一种更优雅的方法可以做到这一点,但这似乎奏效了。在Hpricot 挑战页面上挖掘关于挖掘内容的主题变化。

于 2010-12-09T04:02:56.580 回答