清理刮掉的Nokogiri输出

时间:2012-06-02 02:34:35

标签: ruby nokogiri web-scraping

我正在抓的东西的输出让我留下了这个:

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

2 个答案:

答案 0 :(得分: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>元素,没有人需要关心他们碰巧会遇到什么类。

答案 1 :(得分:2)

  

遵循&#34;惯例&#34;来自doc.css()的答案。

Nokogiri允许您对Nokogiri::HTML的结果运行XPath,就好像它是一个格式良好的XML:

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

P.S。我执行//而不是根/的原因是因为如果您使用Nokogiri::HTML解析抓取剩余部分,它会将其包装到<html><body>中。将XPath写入您的片段/html/body/li/span看起来有点尴尬:)