在 Bash 中解析 HTML(当 grep 还不够时)

在 Bash 中解析 HTML(当 grep 还不够时)

这让我发疯,因为我确信一定有某个程序可以完成这项工作,但我就是找不到它。
需要注意的是,我会使用 ARM/Raspberry,所以不幸的是,Xidel这不是一个选择,除非有人好心地为我指明自己编译它的正确方向(如果可能的话)。我也尝试过,w3m但我不太确定将页面转储到另一个要格式化的文件是否真的有帮助,但请再次证明我错了!

基本上我需要读取 https url,然后将 html 解析为可从 Bash 中轻松访问的内容,最后将一些值存储在数据库中。
我已经简单地使用 完成了大部分工作grep,但是一旦我需要的数据不完全是其应有的格式,我就会陷入困境。参见示例:

<h1>Title</h1> #easy to extract Title only with grep | sed

<h1>
Title
</h1> #no way

所以你可以在这里看到问题,我需要的是一个脚本解决方案,它读取整个页面并给我一个内容数组,而不是我当前拥有的“随机”格式化输出。
感谢大家

答案1

我会使用过滤文件tidy,将每个顶级标记放在单独的行上,并使用更适合此类脚本编写的内容(例如 Perl)来处理标记。 sed当更改非常简单时最有用。

例如,此页面的片段(过滤后)将如下所示(用于tidy -wrap 4096减少换行):

<body class="question-page new-topbar">
<noscript>
<div id="noscript-padding"></div>
</noscript>
<div id="notify-container"></div>
<div id="overlay-header"></div>
<div id="custom-header"></div>
<div class="topbar">
<div class="topbar-wrapper">
<div class="js-topbar-dialog-corral">
<div class="topbar-dialog siteSwitcher-dialog dno">
<div class="header">
<h3><a href="//unix.stackexchange.com">current community</a></h3>
</div>
<div class="modal-content current-site-container">
<ul class="current-site">

标签"a"等将是内联的,但页面结构更易于使用。

我使用“下载”了该页面lynx -source。然而,您可以使用多种工具:wgetcurl更常用于此目的。

答案2

尝试一下小狗。即对于 OSX:

brew install https://raw.githubusercontent.com/EricChiang/pup/master/pup.rb

您可以使用 CSS3 选择器和提取器从属性中获取值href

相关内容