是否可以使用 grep 清理 HTML 文件以提取某些字符串?

Is it possible to clean up an HTML file with grep to extract certain strings?

我参与了一个网站,我想每天从该网站获取信息。该页面如下所示:

User1 added User2. 
User40 added user3. 
User13 added user71
User47 added user461

等等..

没有 JSON 端点来获取信息并对其进行解析。所以我必须 wget 页面并清理 HTML:

<a href="/user1">User1</a> added <a href="/user2">user2</a>

是否可以在用户名总是更改的情况下清除它?

您打算只删除 HTML-标签吗?

然后试试这个:

sed 's/<[^>]*>//g' infile >outfile 

我会把这个问题分成两个:

如何清理你的HTML

是的,可以直接使用 grep,但我建议在使用 grep 之前使用标准工具将 HTML 转换为文本。我能想到两个(html2text是一个转换工具,w3m其实是一个文本浏览器),但还有更多:

  • wget -O - http://www.whosebug.com/ | html2text | grep "How.*\?"
  • w3m http://www.whosebug.com/ | grep "How.*\?"

这些示例将获取 Whosebug 的主页并显示在该页面上找到的所有以 How 开头并以 ? 结尾的问题(它为我显示了大约 20 行这样的行,但 YMMV 取决于您的设置)。

如何只提取需要的字符串

关于您的用户名,您可以调整您的表达式以匹配不同的用户(由于扩展的正则表达式语法,-E 是必需的,-o 将使 grep 仅打印每行的匹配部分:

 [...] | grep -o -E ".ser[0-9]+ added .ser[0-9]+"

然而,这假定用户的名称始终与 .ser[0-9]+ 匹配。您可能想使用像这样的更通用的模式:

[...] | grep -o -E "[[:graph:]]+[[:space:]]+added[[:space:]]+[[:graph:]]+"

此模式将匹配 added 被任意两个其他单词包围,由任意数量的空白字符分隔。或者更简单(假设一个词可能包含除空白以外的所有内容,并且这些词仅由一个空格分隔):

[...] | grep -o -E "[^ ]+ added [^ ]+"