如何在bash中从html中提取td?

时间:2012-04-07 10:46:32

标签: html regex bash shell screen-scraping

我正在查询来自地理名称的伦敦邮政编码数据:

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

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

3 个答案:

答案 0 :(得分: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          

答案 1 :(得分: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。

答案 2 :(得分:0)

如果您可以访问Mojolicious项目中的mojo工具,这一切都变得非常容易:

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)并获得不错的结果。