【问题标题】:Extract text from HTML Table从 HTML 表中提取文本
【发布时间】:2012-04-20 18:34:31
【问题描述】:

我想从 Mac OS X 命令行中将 http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm 表中的文本提取为纯文本格式的纺织品,不带 html 标签。

我尝试了很多 sed 命令,但 sed 只会再次打印整个文件。我做错了什么?

我尝试过的示例

sed -n '/<tr>/,/<\/tr>/p' scoretable.htm (只会打印带有html标签的表格内容:()

【问题讨论】:

  • 你看过相关的问题吗(12等)?

标签: string tags sed web-scraping extract


【解决方案1】:

一点TXR网页抓取,借助wget抓取页面:

@(deffilter nobr ("<br />" ""))
@(deffilter brsp ("<br />" " "))
@(deffilter nosp (" " ""))
@(next "!wget 2>/dev/null -O - http://www.amiriconstruction.co.uk/goodwoodgolf/scoretable.htm")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@(skip)
<div class="scoreTableArea">
@(collect)
<h2 class="unify">@year - @event</h2>
@  (filter brsp event)
@  (collect)
<tr>
<td class="center">@pos</td>
<td>@player</td>
<td>@company</td>
<td>@date</td>
<td class="center">@points</td>
</tr>
@  (filter nobr player company date points)
@  (filter nosp pos points)
@  (until)
</tbody>
@  (end)
@(end)
@(output :filter :from_html)
@  (repeat)

Event: @event
Year: @year

DATE       POS  PT  PLAYER           COMPANY
@    (repeat)
@{date -10}  @{pos -2}  @{points 2}  @{player 16} @company
@    (end)
@  (end)

@(end)

示例运行:

$ txr  scoretable.txr

Event: Teeing off to Clobber Ken
Year: 2011

DATE       POS  PT  PLAYER           COMPANY
 Sept 2011   1  40  John Durrant     King Sumners Partnership
 Sept 2011   2  34  Grahame Pettit   Amiri Construction
  Oct 2011   3  31  Tony Deacon      Gleeds
  Oct 2011   4  29  Tony Boyle       Lacey Hickey Caley 
  Oct 2011   5  29  Richard Hemming  Scott White and Hookins
 Sept 2011   6  29  Ian McCoy        Selway Joyce
 June 2011   7  27  Julian Larkin    C&G Properties
 Sept 2011   8  25  Roque Menezes    Capita Symonds
 June 2011   9  22  Shawn Lambert    PWP Architects
 Sept 2011  10  22  Kevin Lendon     Amiri Construction

Event: Ken Watson (HNW Architects) Undisputed Amiri Golf Demon of the Downs
Year: 2010

DATE       POS  PT  PLAYER           COMPANY
      2010   1  40  Ken Watson       HNW Architects
      2010   2  37  David Heda       London Clancy
      2010   3  34  Gordon Brown     Currie & Brown
      2010   4  32  Alistair Taylor  Wildbrook Properties
             5  30  Andy Goodridge   City Estates
             6  25  Russ Pitman      Henderson Green
             7  24  Phil Piper       Piper Whitlock 
             8  23  Kevin Miller     Urban Pulse Architects
             9  19  Simon Asquith    Godsall Arnold Partnership
            10  19  Shawn Lambert    PWP Architects
            11  18  Martin Judd      Davis Langdon

【讨论】:

  • 请注意,HTML 中的&amp;nbsp; 正在转换为U+00A0 空格。
  • 最好包含指向您的 TXR 下载的链接。祝大家好运。
【解决方案2】:
sed -n 's;</\?td>;;gp' scoretable.html | \
sed -e 's;<td class="center">;;' \
    -e 's;<.*>;;'

请注意,我使用 ; 而不是 / 作为分隔符 - 我发现它更易于阅读。 Sed 将使用您放在's 之后的任何字符作为分隔符。

好的,现在解释一下。第一行:

-n 将抑制输出,但命令末尾的p 告诉 sed 专门打印与模式匹配的所有行。这将只得到包裹在&lt;td&gt; 标签中的行。同时,我找到了任何与&lt;/\?td&gt; 匹配的东西,然后什么都没有。 /\? 表示 / 不能出现或只出现一次,因此这将匹配开始和结束标签。最后的g 或全局的,意味着它在一行中第一次成功后不会停止尝试匹配模式。如果没有g,它只会替换开始标签。

此输出在第二行再次通过管道传输到 sed:

-e 只是指定有一个编辑命令要运行。如果你只运行一个命令,这是隐含的,但这里我运行两个(下一个在第三行)。

这会删除&lt;td class="center"&gt;,下一行会删除任何其他标签(在本例中为&lt;br&gt; 标签。

只有在您确定一行上最多只有一个标签时才能运行最后一个命令。否则.*会贪婪匹配太多,所以在:

<td class="center">24 </ br>

它将匹配整行,并删除所有内容。

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多