【问题标题】:Parse a HTML table using Ruby, Nokogiri omitting the column headers使用 Ruby 解析 HTML 表,Nokogiri 省略列标题
【发布时间】:2017-07-05 18:21:11
【问题描述】:

我无法使用 Nokogiri 和 Ruby 解析 HTML 表格。我的 HTML 表格结构如下所示

<table>
<tbody>
    <tr>
       <td>Firstname</td>
       <td>Lastname</td>
       <td>Middle</td>
    </tr>
    <tr>
       <td>ding</td>
       <td>dong</td>
       <td>ling</td>
    </tr>
    ....
    ....
    .... {more tr's and td's with similar data exists.}
    ....
    ....
    ....
    ....
    ....       
 </tbody>
 </table>

在上面的 HTML 表格中,我想完全删除第一个和相应的元素,所以删除 Firstname、Lastname 和 Middle 即,我想开始只从第二个中剥离文本。所以这样我只能从第二个或 tr[2] 中获取表的内容,而没有列标题。

谁能给我一个关于如何做到这一点的代码。

谢谢。

【问题讨论】:

  • 定义“剥离文本”。你到底想要什么输出?

标签: ruby nokogiri


【解决方案1】:
require 'rubygems'
require 'nokogiri'

doc = Nokogiri::HTML(x)
rows = doc.xpath('//table/tbody/tr[position() > 1]')

# OR

rows = doc.xpath("//table/tbody/tr")
header = rows.shift

在您运行上述 2 个 sn-ps 中的任何一个后,rows 将包含第一个之后的每个 &lt;tr&gt;...&lt;/tr&gt;。例如puts rows.to_xml 打印以下内容:

<tr><td>ding</td>
       <td>dong</td>
       <td>ling</td>
    </tr>

要获取内部文本,删除所有 html 标签,运行puts rows.text

ding
       dong
       ling

要仅获取 td 标记的内部文本,请运行 rows.xpath('td').map {|td| td.text }

["ding", "dong", "ling"]

【讨论】:

  • 你确定这是否会给我第二个 tr[2] 中的文本。我不想将其转换为 xml。我只想要从第二个 tr[2] 开始的 HTML 文本。
  • 嗨,约翰,感谢您的解释。我稍微修改了代码 sn-p 并做到了这一点。这个对我有用。 rows.xpath('td').map(&:text)[0,3]。我还有一个需要帮助的请求。我该怎么做呢。我在表的第二列和第三列中每个值的开头都有一个 $ 符号。如何仅剥离美元符号并仍然从所有 3 列中提取文本。所以我得到 ["ding" "$10000" "$0.4567"]。添加 $symbol 是因为它们是美元值。所以我想只去掉美元符号,仍然从 td 中获取文本。你能帮我解决这个问题吗?
【解决方案2】:

或者:

table.css('tr')[1..-1]

或删除从第 2 行开始的文本:

table.css('tr')[1..-1].map{|tr| tr.css('td').map &:text}

【讨论】:

    【解决方案3】:

    由于 Nokogiri 确实支持:has CSS pseudo-class,因此您可以使用标题行

    @doc.at_css('table#table_id').css('tr:has(th)')
    

    因为它也支持 :not CSS 伪类,所以你可以使用

    @doc.at_css('table#table_id').css('tr:not(:has(th))')
    

    分别。根据您的喜好,您可能希望避免否定并只使用css('tr:has(td)')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2013-04-02
      • 1970-01-01
      • 2010-11-13
      • 2012-07-05
      相关资源
      最近更新 更多