2010-12-08 85 views
0

我想解析一个HTML文件使用Hpricot和Ruby,但我有问题提取“自由浮动”的文字不包含在标签如<p></p>如何使用Hpricot使用<br />标签从网页中提取文本?

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号线,等?

回答

1

你的第一步是阅读following_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_siblingsparent.children代替的parent.containers。访问你使用的库的源代码是非常方便的,研究它是值得鼓励的。

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>节点,或者跟随具有某个href属性的<a>标记后的五行。这是处理HTML的乐趣和挑战。

在我的脑海里,有一种唠叨的想法,有一种更优雅的方式来做到这一点,但这似乎是行得通的。挖掘Hpricot Challenge page以了解挖掘内容的主题变体。

相关问题