2009-11-18 153 views
4

我正在使用mechanize/nokogiri,需要解析出以下HTML字符串。 任何人都可以帮助我用xpath语法来做到这一点或任何其他方法,将工作?Ruby Nokogiri解析HTML表

<table> 
    <tr class="darkRow"> 
    <td> 
     <span> 
     <a href="?x=mSOWNEBYee31H0eV-V6JA0ZejXANJXLsttVxillWOFoykMg5U65P4x7FtTbsosKRbbBPuYvV8nPhET7b5sFeON4aWpbD10Dq"> 
      <span>4242YP</span> 
     </a> 
     </span> 
    </td> 
    <td> 
     <span>Subject of Meeting</span> 
    </td> 
    <td> 
     <span> 
     <span>01:00 PM</span> 
     <span>Nov 11 2009</span> 
     <span>America/New_York</span> 
     </span> 
    </td> 
    <td> 
     <span>30</span> 
    </td> 
    <td> 
     <span> 
     <span>[email protected]</span> 
     </span> 
    </td> 
    <td> 
     <span>39243368</span> 
    </td> 
    </tr> 
    . 
    . 
    . 
    <more table rows with the same format> 
</table> 

我想这个作为输出

"4242YP","Subject of Meeting","01:00 PM Nov 11 2009 America/New_York","30","[email protected]", "39243368" 
. 
. 
. 
<however many rows exist in the html table> 

回答

4

这样的事情?

items=doc.xpath('//tr').map {|row| row.xpath('.//span/text()').select{|item| item.text.match(/\w+/)}.map {|item| item.text} } 

回报: => [[ “4242YP”, “会议的主题”, “下午1点00”, “2009年11月11日”, “美国/纽约”, “30”,“示例@ email.com“,”39243368“],[”abcdefg“]]

选择仅包含以单词字符开头的跨度(例如,不包括跨度有一部分的空白)。您可能需要根据您的具体情况改进“选择”过滤器。

我添加了一个极简主义行,其中包含一个包含abcdefg的span,以便您可以看到嵌套数组。

+0

没有完全使用你的例子,但它让我想到了不同的方法。谢谢您的帮助! – thomas 2009-11-18 19:21:11

+0

是的,我只能冒险猜测你的HTML格式是如何可预测的,以及嵌套跨度的加入有多重要,所以你可以从极简主义中工作。 – JasonTrue 2009-11-18 19:35:18

0

这里的XSL的一部分,改变你的输入,如果你有一个XSL转换:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//tr"/> 
</xsl:template> 

<xsl:template match="tr"> 
    "<xsl:value-of select="td/span/a/span"/>","<xsl:value-of select="td[position()=2]/span"/>","<xsl:value-of select="td[position()=3]/span/span[position()=1]"/>" 
</xsl:template> 

</xsl:stylesheet> 

输出产生这个样子的:

"4242YP","Subject of Meeting","01:00 PM" 
"4242YP","Subject of Meeting","01:00 PM" 

(我复制你的第一个表行)。

XSL选择位为您提供了一个XPATH输入的好主意,您需要休息一下。