将HTML可扩展列表转换为表格或csv格式

时间:2014-03-25 12:56:55

标签: html bash parsing csv

我知道这个话题已被覆盖了几次,但我找不到适用于我的案例。我不是一个经验丰富的计算机用户,请记住,虽然我可以玩bash,R,也可能运行perl脚本。仅供参考 - 我在我的机器上运行Ubuntu。

我想要做的是转换以下网页http://www.genome.jp/kegg-bin/get_htext?br08902.keg的可展开列表(请使用"一键式模式"完全展开)为表格或csv格式,每个级别的缩进都转到一个单独的列。

对于在其下方分组的所有元素重复父类别也不会那么糟糕。类似下面的标签,我手动为页面的前几行。

Pathways and Ontologies Pathways    br08901  KEGG pathway maps
Pathways and Ontologies Functional hierarchies  br08902  BRITE functional hierarchies
Genes and Proteins  Orthologs and modules   ko00001  KEGG Orthology (KO)
Genes and Proteins  Orthologs and modules   ko00002  KEGG pathway modules
Genes and Proteins  Orthologs and modules   ko00003  KEGG modules and reaction modules
Genes and Proteins  Protein families: metabolism    ko01000  Enzymes
Genes and Proteins  Protein families: metabolism    ko01001  Protein kinases
Genes and Proteins  Protein families: metabolism    ko01009  Protein phosphatases and associated proteins
Genes and Proteins  Protein families: metabolism    ko01002  Peptidases
Genes and Proteins  Protein families: metabolism    ko01003  Glycosyltransferases
Genes and Proteins  Protein families: metabolism    ko01005  Lipopolysaccharide biosynthesis proteins
Genes and Proteins  Protein families: metabolism    ko01004  Lipid biosynthesis proteins

提前致谢!

1 个答案:

答案 0 :(得分:2)

此任务需要一些分离良好的步骤。击穿:

获取页面内容。您可以使用例如curlwgetfetch或类似程序。 E.g。

curl http://...

将下载页面内容。

在您的页面中,存在一个“download htext”链接。当您检查它指向的位置时,您会发现需要从链接中下载

http://www.kegg.jp/kegg-bin/download_htext?htext=br08902.keg&format=htext&filedir=
                                                 ^^^^^^^^^^^ name of your needed keg

之后

curl "http://www.kegg.jp/kegg-bin/download_htext?htext=br08902.keg&format=htext&filedir=" > mykeg.txt

将获得下一个文件:(缩写)

+C      Br number
#<h2><a href="/kegg/kegg2.html"><img src="/Fig/bget/kegg3.gif" align="middle" border=0></a>&nbsp; BRITE Functional Hierarchies</h2>
#<!---
#ENTRY       br08902
#NAME        Brite
#DEFINITION  BRITE functional hierarchies
#--->
!
A<b>Pathways and Ontologies</b>
B  Pathways
C    br08901  KEGG pathway maps
B  Functional hierarchies
C    br08902  BRITE functional hierarchies
#
A<b>Genes and Proteins</b>
B  Orthologs and modules
C    ko00001  KEGG Orthology (KO)
C    ko00002  KEGG pathway modules

这是一个很好的文本文件,大多没有HTML标记。使用常见的bash工具轻松解析。

首先清理一下:

使用sed命令删除所有不需要的行

sed '/^[#!+]/d'

删除不需要的html标记(通常不可能使用正则表达式,但在这种情况下可能)

sed 's/<[^>]*>//g'

将分隔符添加到前导字符

sed 's/^./& /'

在上面之后,你得到一个像下一个

的文本
A Pathways and Ontologies
B   Pathways
C     br08901  KEGG pathway maps
B   Functional hierarchies
C     br08902  BRITE functional hierarchies
A Genes and Proteins
B   Orthologs and modules
C     ko00001  KEGG Orthology (KO)
C     ko00002  KEGG pathway modules
C     ko00003  KEGG modules and reaction modules

什么是bash

的漂亮,可解析的结构
while read -r prefix content
do
     echo "do something with a line >>$content<< with a prefix >>$prefix<<"
done

您可以使用prefix命令测试case,例如:

case "$prefix" in
    A) a="$content" ;;
    B) b="$content" ;;
    C) c="$content" ;;
esac

使用associative arrays存在更好的替代方案,但上述内容很简单且有效......

您现在拥有制作有效解决方案所需的所有信息(8行)。

接下来取决于你......;)

修改

通常我不做整个工作,因为stackoverflow不是一个自由编程服务,但是好的 - 这是脚本:

kegfile="KEG"
while read -r prefix content
do
    case "$prefix" in
        A) col1="$content" ;;
        B) col2="$content" ;;
        C) echo -e "$col1\t$col2\t$content";;
    esac
done < <(sed '/^[#!+]/d;s/<[^>]*>//g;s/^./& /' < "$kegfile")