5.6 解析网站数据

消除不必要的细节有助于解析网页数据。sedawk是完成这项工作的主要工具。在4.3节中,我们见到过一份演员评级列表。这个列表就是通过解析http://www.johntorres.net/BoxOfficefemaleList.html得到的。

让我们看看如何使用文本处理工具来解析同样的数据。

5.6.1 实战演练

请看下面用于从网站解析演员详细信息的命令序列:

  1. $ lynx -dump http://www.johntorres.net/BoxOfficefemaleList.html | \
  2. grep -o "Rank-.*" | \
  3. sed 's/Rank-//; s/\[[0-9]\+\]//' | \
  4. sort -nk 1 |\
  5. awk '
  6. {
  7. for(i=3;i<=NF;i++){ $2=$2" "$i }
  8. printf "%-4s %s\n", $1,$2 ;
  9. }' > actresslist.txt

输入如下:

  1. # 由于版面空间限制,只显示前3位演员的信息
  2. 1 Keira Knightley
  3. 2 Natalie Portman
  4. 3 Monica Bellucci

5.6.2 工作原理

Lynx是一个基于命令行的网页浏览器。它并不会为我们显示出一堆原始的HTML代码,而是能够打印出网站的文本版本,这个文本版和我们在浏览器中看到的页面一模一样。这样一来,就免去了移除HTML标记的工作。我们按照下面的方法用sed解析以Rank开头的行:

  1. sed 's/Rank-//; s/\[[0-9]\+\]//'

然后再根据评级情况对这些行排序。这里我们要使用awk来指定宽度,以保持演员的评级信息和姓名之间的空隙。%-4s指定了4个字符的宽度。除了第一个字段外,所有的字段都用$2拼接成了一个字符串。

5.6.3 参考

  • 4.6节讲解了sed命令。

  • 4.7节讲解了awk命令。

  • 5.3节讲解了lynx命令。