使用Ruby和nokogiri在元素中提取构造不良的内容

时间:2013-06-07 00:17:19

标签: ruby split nokogiri

我希望将内容写入来自构造不良的源站点的csv行。我的csv行很简单:

COMPANY_NAME,WEBSITE,EMAIL,TEL1,TEL2,FAX,STREET,CITY,STATE,ZIP,COUNTRY

不幸的是,源代码没有干净的ID和要搜索的类。在一堆“对我无用”元素之间,我需要将所有内容捆绑在一个<p>元素中,如下所示:

<h2 class="lead">Contact Details</h2>
<br>
<p><!--what I want is in here -->
  <strong>COMPANY_NAME/strong> <br>
  STREET<br>
  CITY, STATE ZIP<br>
  COUNTRY<br>
  Tel: +1 555 555 5555<br>
  Tel: +1 555 555 5555<br>
  Fax: +1 555 555 5555<br>
  Email: <a href="mailto:EMAIL_ADDRESS</a><br>  
  URL: <a target="_blank" rel="nofollow" href="http://www.COMPANY_WEB_ADDRESS.com">
  www.COMPANY_WEB_ADDRESS.com</a><br>                 
</p>

所以,我现在的代码(我相信你会笑得很开心)就是:

page = Nokogiri::HTML(open('http://www.SOURCE/'))
page.css('h2.lead')[0].next_element.next_element

这条丑陋的线条找到第一次出现的带有类别引导的页面h2元素。我必须明确使用[0]来应用方法?我捕获元素错了吗?然后我使用两个“next_element”调用在我选择之后抓取<p>元素两个元素。我写了这篇文章但是在我选择之后我似乎无法遍历第n级!最后,我想要的<p>元素和所有内容都被捕获了! YAY Mini胜利!

输出非常难看(更不用说我的一个内容非常难看)而且我不确定将<p>内容“分解”为可以输出到csv的数组的最佳方法。

我很想把它写成一个文件,并使用linux终端来清理它...这将是作弊和退出!

任何方向都会受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

你可以通过以下方式获得:

p = page.at('h2.lead + br + p')

要分解内容,也许这样做很好:

p.children.map &:text