下载网页并删除除一个 html table 之外的内容

Download web page and remove content except for one html table

我经常收到来自另一个部门的大型 html 报告,需要大量手动工作才能编辑成所需的格式。

我想更聪明地工作。我可以通过以下方式下载页面:

wget -qO- <https://the_page.html>

但是我只想创建一个 table 开头:

<!-- START Daily Keystroke

它持续了很多行 html 并且总是结束:

</table>
</div>
</div>

在下一次加载数据开始之前。我需要在一大块文本 /file 中这些模式之间的所有内容。

我玩过 sed 和 awk,我不是很熟悉,但似乎不知道每次这些工具不适合此任务时文件中会有多少行。似乎更适合特定模式的东西是合适的。

既然如此,我可能会安装其他实用程序。如果有人有任何可能有用的经验?

I played around with sed and awk

请注意,这些最适合处理可能使用正则表达式描述的内容,HTML 不适合。 HTML 解析器是专门用于 HTML 文档的设备。通常,您应该避免使用正则表达式来处理 Chomsky Type-2 装置。

That being the case I can install other utilities potentially. If anyone has any experience of something that might work?

我建议尝试 hxselect as it allows easy extraction of element(s) matching CSS selector. It does use stdin so you might pipe output into it, consider following example: I want to download www.example.com 页面并提取其标题标签,然后我可以这样做:

wget -q -O - https://www.example.com | hxselect -i 'title'

如果你遇到一些 ill-formed HTML 你可能会使用 hxclean 它会尝试让它像这样接受 table 到 hxselect

wget -q -O - https://www.example.com | hxclean | hxselect -i 'title'

如果以上任何一项都适用于您的 URL,那么您可能会开始寻找 CSS 选择器,它只描述了您要提取的 table。有关可用功能,请参阅 CSS selectors reference。我无法在没有看到整个页面源的情况下制作选择器。

建议 gawk 剪切第一个 multi-line 记录。接着是sed,头部修剪直到<!-- ...

gawk 'NR==1{print}' RS="</table>\n</div>\n</div>" input.html |sed '0,/<!-- START Daily Keystroke/d'

或没有中间文件:

wget -qO- <https://the_page.html>| \
gawk 'NR==1{print}' RS="</table>\n</div>\n</div>" | \
sed '0,/<!-- START Daily Keystroke/d'

此脚本经过测试可与提供的示例文本一起使用。

gawk 解释:

gawk 脚本在第一次出现时剪切输入文本。

</table>
</div>
</div>

与左边距对齐。

NR==1{print}

仅打印gawk记录编号1。

第一条记录由所有文本(多行)标识,以 RS 变量中的匹配模式终止。

RS="</table>\n</div>\n</div>"

匹配 gawk multi-line 记录分隔符的正则表达式 (RegExp)。

如果您想在 RegExp 中包含缩进空格。尝试:

          </table>
        </div>
      </div>

RS="[[:space:]]*</table>[[:space:]]*\n[[:space:]]*</div>[[:space:]]*\n[[:space:]]*</div>"

sed 解释:

删除所有行,直到第一次出现 RegExp <!-- START Daily Keystroke

0,/<!-- START Daily Keystroke/

sed 行范围。从行 0 开始,直到匹配 <!-- START Daily Keystroke/

的第一行

d

Delete/ignore 范围内的所有行。