在终端中列出某个站点的某些内容

在终端中列出某个站点的某些内容

这是我今天实践考试的 12 个问题之一。任务的第一部分,我们应该列出第一页的内容http://slashdot.org。我使用 lynx 来完成这个。然后,对于第二部分,我们被要求以这样一种方式过滤输出,只列出 slashdot.org 第一页的标题(文章名称)(这个真的让我很头疼)。请记住,这是 100 分钟考试中 12 项任务中的一项,所以我认为有一种快速的方法可以完成它,但我无法找到可辨别的模式。关于如何解决这个问题有什么想法吗?

答案1

grep '<h.*>.*<\/h.>' sample.html | sed -e 's/<[^>]*>//g'

grep ‘regex(所有标题标签)’ 文件名管道(“|”) sed 删除所有 html 标签

这应该可行。

答案2

您需要两个组件。首先,您需要一些可以获取 slashdot 主页(原始 html)的东西,然后一些可以让您从中获取标题的东西。

第一个组件可以是curlwget。我偏爱wget

wget -O slashdot.htmlhttp://slashdot.org

接下来,使用文本编辑器查看 slashdot.html。您会发现标题包含在标签中。因此,第二个组件是能够很好地理解 HTML 的东西,可以让您仅获取 h2 标签。您可以使用 grep、awk 或 sed 通过一些巧妙的正则表达式来执行此操作,但您会发疯的。我更喜欢更了解 HTML 的东西。如果允许您安装额外的软件包,请获取软件包libxml2-utils并使用xmllint。它可以解析 HTML(使用 -html 开关)并理解用于 HTML/XML 节点选择的 xpath 符号。解释 xpath 超出了此处答案的范围,它将成为一个非常好的研究主题,供您进一步学习,因此我建议您谷歌搜索“xpath”以了解其工作原理。

唯一的额外技巧是 xmllint 将逐字打印 h2 节点中的文本,因此它们全都在一行中,因此看起来很丑陋。我还将使用重定向和管道来避免创建临时文件,并丢弃 xmllint 的 html 验证输出(slashdot html 非常不合规):

wget -q -O - http://slashdot.org | xmllint -html -xpath '//h2/span/a/text()' - 2>/dev/null

您会注意到,标题全部显示在一行中。现在,要将它们分开,请将其更改为以下内容(\n在结束之前插入一个字符作为标题文本的一部分</a>):

wget -q -O - http://slashdot.org | sed 's/<\/a>/\n<\/a>/g' | xmllint -html -xpath '//h2/span/a/text()' - 2>/dev/null
  1. 首先,使用 wget 获取 slashdot 主页,将 HTML 输出到标准输出 ( -O -),并抑制 wget 进度消息 ( -q)。
  2. \n将其通过管道传输到 sed 以在每个结束标签后添加</a>
  3. 最后将其通过管道传输到 xmllint(用作-从 stdin 读取的输入文件),要求它使用 html 解析器并仅显示与给定的 xpath 表达式匹配的节点,丢弃任何诊断输出(2>/dev/null丢弃标准错误)。

相关内容