【问题标题】:Extract text from HTML based on table column via Shell Script通过 Shell 脚本从基于表格列的 HTML 中提取文本
【发布时间】:2012-10-31 21:26:26
【问题描述】:

我需要编写一个 shell 脚本来读取一个 html 文件 sample.html 并根据另一个表列从一个表列中提取数据。例如,这是 HTML 代码:

<table style="BORDER-COLLAPSE: collapse"
  border="0" bordercolor="#000000"
  cellpadding="3" cellspacing="0" width="100%" height="200">
  <tr >
    <td class="fontStyleOne" width="30%">
      <div align="left">
      core6690.myserverdomain.com </div>
    </td>
    <td  class="tdfontTwo" width="30%">
      <div class="label-styler" align="left">
      admin</div>
    </td>
  </tr>
  <tr >
    <td class="fontStyleOne" width="30%">
      <div align="left">
      core6691.myserverdomain.com </div>
    </td>
    <td  class="tdfontTwo" width="30%">
      <div class="label-styler" align="left">
      secondary </div>
    </td>
  </tr>
  <tr >
    <td  class="fontStyleOne" width="30%">
      <div align="left">
      core6692.myserverdomain.com </div>
    </td>
    <td  class="tdfontTwo" width="30%">
      <div class="label-styler" align="left">
      primary </div>
    </td>
  </tr>
</table>

假设我想确定“admin”的 URL,那么结果将是 core6690.myserverdomain.com;如果我的输入是“primary”,那么输出将是“core6692.myserverdomain.com”等等......

HTML 页面有更多数据、页眉标签、页脚等,但我要查找的重要内容放在一个表中,其结构与我在代码中列出的完全相同...除了它有更多的行,不一定像本例那样只有 3 行。

我在这个网站上看到了 seg、grep、正则表达式、awk 和其他工具的相关答案,但是它们都没有足够接近我正在寻找的东西......而且我对任何一个都没有太多经验修改并使其适合我的需要的方法。

有什么建议吗?提前致谢。

【问题讨论】:

  • 不要指望有人回答,提供 bash 的帮助。你应该使用 perl 模块进行 HTML 解析和 HTML 表格提取,真的。当然,理论上这也可以在 bash 和 sed 中完成,但是这种情况下的 perl 解析方法会更好,真的。
  • 感谢 Piotr Wadas,但是我有一个限制,我必须按照当前的情况进行操作。
  • 必须是纯 bash,还是可以使用额外的工具?如果不是perl,你可以使用awk吗? PHP 呢?请注意,任何不涉及 DOM 解析器的解决方案(如在 perl 或 PHP 或 Python 中)都非常容易被破解。您需要确保您没有将自己列为作者。这种事情不应该出现在你的简历上
  • 嗨@ghoti,感谢您的cmets。我理解将工具集限制为操作系统中的 bash 或预编译实用程序的含义......以及关于作者/CV/等,它们与问题或其上下文无关......这个问题是基于纯粹的学术术语挑战。我可以选择 python、perl、PHP 甚至 Java 的路径,但这不是当前上下文中问题的重点。

标签: regex linux bash shell


【解决方案1】:

如果允许您使用其他工具,我的 Xidel 可以做到这一点。

使用 xpath:

xidel /tmp/f.html -e "//tr[td[2] = 'admin']/td[1]"

或模式匹配:

xidel /tmp/f.html -e "<tr><td>{.}</td><td>admin</td></tr>

至少你发布的摘录是这样的,对于更大的文件,它取决于还有什么。

【讨论】:

  • 哇,这是一个很棒的工具@BeniBela,感谢您发布它。我确实研究过,但是我不得不考虑操作系统的内置/可用工具。干杯!
  • 你有 ppa 吗?那太棒了
  • 没有。我尝试在所有 linux 的构建服务器上构建它,但是它是用 FreePascal+Lazarus 编写的,并且服务器无法安装 Lazarus。但是,我只使用 Lazarus 来获得 UTF-8 支持,而新的 FreePascal 本身已经完全支持 UTF-8,所以我可以放弃 Lazarus 并单独使用 FreePascal 再试一次。
【解决方案2】:
#/bin/bash

for i in `cat sample.html | grep '<\/div>' | sed 's/\s\+//'|sed 's/<.*>//'`; do
    if [ $i == $1 ];
    then
        echo $prev
    fi
    prev=$i
done

使用示例

$ ./filter.sh primary
core6692.myserverdomain.com

P.s: sample.html 的格式应该是你在这里发布的,服务器和名称应该以标签结尾,并以空格或制表符开头。

【讨论】:

  • 这正是我的意思,没有花哨的东西,只是一个简单的可用工具的简单解决方案。非常感谢@servn!
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2011-10-14
  • 2014-08-23
相关资源
最近更新 更多