2012-06-02 34 views
0

的就是我刮输出给我留下了这一点:清理刮引入nokogiri输出

<li><img class="static" src="pic.jpg"><span id="dynamic1" class="the text">I like turtles</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic2" class="the text">I like bears</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic3" class="the text">I like ruby</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic4" class="the text">I like oranges</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic5" class="the text">I like keyboards</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic6" class="the text">I like movies</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic7" class="the text">I like Android</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic8" class="the text">I like Mac</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic9" class="the text">I like music</span></li> 
<li><img class="static" src="pic.jpg"><span id="dynamic10" class="the text">I like boats</span></li> 

有一个与跨类中的每个时间是不同的约100行的这一点,和“我喜欢乌龟“每一部分都有所不同。

理想情况下,我只希望每行的“我喜欢海龟”部分。有没有办法得到这个?

实施例10行

+1

有一种方法;如果你发布了这100行中的10行,我们可以确定正确的模式...... –

+0

是否正确假设你的'span',不管class是什么,总是遵循(就像在'after-sibling'中一样) 'img',是'li'的孩子吗? –

+0

添加了10行。 – Stn

回答

2

如果结束了这样一堆HTML的:

<ul> 
    <li><img ...><span ...>I want this text</span></li> 
    <li><img ...><span ...>I want this text</span></li> 
    ... 
</ul> 

然后,可以提取<li>秒,然后提取各<li>文本而忽略内部的标签它:

texts_you_want = doc.css('li').map(&:text) 

这将忽略内部吨的<img><span>元件他<li> s,没有人需要关心他们碰巧有什么类。

+0

非常感谢。我将不得不阅读地图方法。 – Stn

2

遵循与“doc.css()”相关的“约定”。

引入nokogiri允许你对Nokogiri::HTML结果运行的XPath,如果它是一个良好的XML:

text_you_want = doc.xpath("//li/span").map(&:text) 

附:我做//而不是根/的原因是因为如果你用Nokogiri::HTML解析你的剩菜,它会把它包装到你的<html><body>中。写XPath到你的片段/html/body/li/span看起来有点尴尬:)

+0

能否请你解释一下“map(&:text)”的工作原理,或者有关它的任何指针,“&:”看起来很有趣,它是如何工作的?它似乎不是一个标准的运营商,看起来像一个魔术。 –

+2

@AmolPujari,谷歌“处理程序的符号”。你会发现和学习的东西远远超过我在评论领域所能说的。 –

+1

@AmolPujari:简而言之,'x.map(&:m)'是'x.map {| o | o.m}',它可以很好地消除块和可变噪声,并且可以让你直接点。 –