2013-10-26 45 views
0

我试图来处理HTML文档转换成特定的输出,我好不容易才得到这样的事情:如何将HTML文档格式化为特定输出?

<div class="country"> 
    <b>Austria</b> 
    <div>Wolfhard</div> 
</div> 
<div class="country"> 
    <b>Bulgaria</b> 
    <div>Nestor</div> 
</div> 
<div class="country"> 
    <b>Croatia</b> 
    <div>Sabina</div> 
    <div>Florencije</div> 
</div> 
<div class="country"> 
    <b>Czech Republic</b> 
    <div>Šarlota</div> 
    <div>Zoe</div> 
</div> 

我想实现这样的事情:

Austria 
Wolfhard 
Bulgaria 
Nestor 
Croatia 
Sabina, Florencije 
Czech Republic 
Šarlota, Zoe 

名字的最大金额3.

+0

Stack Overflow期望您展示您尝试过的内容,或者您​​试图解决此问题时显示的内容。这是为了避免人们要求我们为他们编写代码的情况。那么,你有什么尝试? –

回答

0

您的HTML是无效的样本。使用有效的最小样本数据很重要。

我不靠近我的电脑,但这个看起来大约右:

require 'nokogiri' 
# encoding: utf8 

html = '<html> 
    <body> 
    <div class="country"> 
     <b>Austria</b> 
     <div>Wolfhard</div> 
    </div> 
    <div class="country"> 
     <b>Bulgaria</b> 
     <div>Nestor</div> 
    </div> 
    <div class="country"> 
     <b>Croatia</b> 
     <div>Sabina</div> 
     <div>Florencije</div> 
    </div> 
    <div class="country"> 
     <b>Czech Republic</b> 
     <div>Šarlota</div> 
     <div>Zoe</div> 
    </div> 
    </body> 
</html>' 

doc = Nokogiri::HTML(html) 

,设置了一个解析DOM。

# encoding: utf8 

下面是如何搜索DOM::因为有UTF-8字符,它告诉红宝石一下,如果你正在使用Ruby < V2.0,这就是为什么编码线是有重要

countries = doc.search('.country') 
data = countries.map { |country| 
    name = country.at('b').text 
    cities = country.search('div').map(&:text) 
    { 
    :name => name, 
    :cities => cities 
    } 
} 

返回哈希数组,其中每个哈希包含国家名称和城市名称的子数组。从那里你可以轻松地遍历数组并根据需要输出值。

这一切都非常简单,你只需要思考的渐进的步骤方面:

  1. 由于有多个div标签与class="country",有可能重复他们使用searchcss方法了。 css需要CSS选择器,而search允许CSS或XPath。我通常使用search,因为有时我会使用CSS,有时XPath,并且可能会在它们之间跳转,因为我正在开发代码,因为可能会更好地流动。除了选择器之外,必须更改方法名称是一件痛苦的事情。
  2. 对于每个选定的div,可以很容易地使用at抓取嵌入的<b>标签,该标签抓取第一个找到的匹配元素,然后search用于匹配城市的嵌入式div。