2

我正在从地名查询伦敦邮政编码数据:

http://www.geonames.org/postalcode-search.html?q=london&country=GB

我想将输出转换为仅包含邮政编码标识符(Bethnal Green、Islington 等)的列表。仅在 bash 中提取名称的最佳方法是什么?

4

3 回答 3

4

我不确定您是指这个\n分隔列表(还是括号和逗号分隔的列表)

html='http://www.geonames.org/postalcode-search.html?q=london&country=GB'
wget -q "$html" -O - |
  w3m -dump -T 'text/html'|
    sed -nr 's/^ +[0-9]+ +(.*) +[A-Z]+[0-9]+ +United Kingdom.*/\1/p'

w3m是:“具有出色表格/框架支持的WWW 可浏览寻呼机”

输出(前 10 行)

London Bridge   
Kilburn         
Ealing          
Wandsworth      
Pimlico         
Kensington      
Leyton          
Leytonstone     
Plaistow        
Poplar          
于 2012-04-07T11:52:19.810 回答
1

我看到该站点提供(但不是免费的)带有 XML 或 JSON 数据的 Web 服务......这将是最好的方式,因为 HTML 页面并不意味着(容易)被解析。

无论如何,没有什么是不可能的,但是如果不是不可能的话,严格地只使用 bash 命令会非常困难;通常通过管道传输其他几个常用工具以实现结果。但是,有时坚持使用像 Perl 这样的单一工具会更方便,而不是结合 cat、grep、awk、sed 和其他任何工具。

就像是

sed -e 's/>/>\n/g' region.html |
   egrep -i "^\s*[A-Z]+[0-9]+</td>" |
   sed -e 's|</td>||g'

假设代码的特定格式,提取了 200 行。

添加

如果您可以用来解析数据的软件没有限制,那么您可以使用如下行

wget -q "http://www.geonames.org/postalcode-search.html?q=london&country=GB" -O - |
     sgrep '"<table class=\"restable\"" .. "</table>"' | 
     sed -e 's|/tr>|/tr>\n|g; s|</td>\s*<td[^>]*>|;|g; s|</th>\s*<th[^>]*>|;|g; s|<[^>]\+>||g; s|;;&nbsp;.*$| |g' |
     grep -v "^\s*$" |
     tail -n+2 | cut -d";" -f2,3

;它在 CSV 和 awk中提取由类似分隔的地点和邮政编码:

wget -q "$html" -O - | 
     w3m -dump -T 'text/html' |
     awk '/\s*[0-9]+ / { print substr($0, 11, 16); }'

这是基于 Peter.O 的答案并提取相同的数据......等等。但在这些情况下,由于您不限于大多数 Unix 或 GNU 系统上的最小工具,我会坚持使用一个广泛使用的工具,例如 perl。

于 2012-04-07T11:18:13.930 回答
1

如果您可以访问mojoMojolicious 项目中的工具,这一切都会变得容易得多:

mojo get 'http://www.geonames.org/postalcode-search.html?q=london&country=GB' '.restable > tr > td:nth-child(2)' text | grep ^'[a-zA-Z]'

最后grep的只是过滤掉一些垃圾结果;几乎(但不完全)每隔一行都是坏的,因为页面结构略有不一致。否则你可以说tr:nth-child(even)并得到很好的结果。

于 2012-04-16T17:35:23.323 回答