0

我正在建立一个 GSA 关键字列表。我有一个关键字列表,以及它们应该链接到的 url。我需要为链接提供一个标题列表。我能想到的最好的地方是 HTML 中的标题标签。

给定一个格式如下的列表:

bash,PhraseMatch,http://stackoverflow.com/questions/tagged/bash,
html,PhraseMatch,http://stackoverflow.com/questions/tagged/html,
carreers,PhraseMatch,http://careers.stackoverflow.com/faq,

我想要一个这样的列表:

bash,PhraseMatch,http://stackoverflow.com/questions/tagged/bash,Newest 'bash' Questions
html,PhraseMatch,http://stackoverflow.com/questions/tagged/html,Newest 'html' Questions
carreers,PhraseMatch,http://careers.stackoverflow.com/faq,Stack Overflow Carreers 2.0

它所做的只是查找 URL,获取标题标签,并将其附加到行尾。这是我到目前为止所拥有的:

{
for line in $( cut -d ',' -f 3 input.csv );
{
    wget --no-check-certificate --quiet -O - $line \
    | paste -sd ' ' - \
    | grep -o -e '<head[^>]*>.*</head>' \
    | grep -o -e '<title>.*</title>' \
    | cut -d '>' -f 2 \
    | cut -d '<' -f 1 \
    | cut -d '-' -f 1 \
    | tr -d '   ' \
    | sed 's| *\(.*\)|\1|g' \
    | paste -s -d '\n' - \
    ;
}
} | paste -d ' ' input.csv - > output.csv

我遇到的问题是某些页面返回了各种错误。在那种情况下,我没有得到任何数据。这导致不生成任何行。当我进行粘贴以合并两个流时,它们的大小不同。

我正在寻找一种方法来检查空数据并返回一个空行。帮助?

4

1 回答 1

1

忽略使用一组命令行工具解析 HTML 的问题,您可以用一个固定的错误字符串替换未完成的命令的输出。(我认为我没有将支票插入管道中的正确位置,但希望您可以进行更正):

set -o pipefail
while IFS=, read first second line rest; do
    wget --no-check-certificate --quiet -O - $line | 
      paste -sd ' ' - |
      grep -o -e '<head[^>]*>.*</head>' |
      grep -o -e '<title>.*</title>' |
      cut -d '>' -f 2 |
      cut -d '<' -f 1 |
      cut -d '-' -f 1 |
      tr -d '   ' | 
      sed 's| *\(.*\)|\1|g' | 
      paste -s -d '\n' - \
  || echo "<no output found>"   # If any part of the pipeline fails
 done < input.csv | paste -d ' ' input.csv - > output.csv
于 2013-05-16T20:36:29.377 回答