快速解析Sitemap

时间:2013-08-15 22:04:33

标签: python sed awk sitemap

我有30个站点地图文件如下所示:

<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
    <loc>http://www.A.com/a</loc>
    <lastmod>2013-08-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.6</priority>
</url>
<url>
    <loc>http://www.A.com/b</loc>
    <lastmod>2013-08-01</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.6</priority>
</url>
...
</urlset>

输出我希望每个url标记的每行有四列,打印到屏幕

http://www.A.com/a 2013-08-01 weekly 0.6
http://www.A.com/b 2013-08-01 weekly 0.6 

我使用的方式是Python BeautifulSoup来解析标签,但是,性能非常慢,因为那里有30多个文件,每个文件有300,000行。我想知道是否有可能使用一些shell AWK或SED来做那个或..我只是使用错误的工具来做到这一点。

由于站点地图格式很好,可能会有一些正则表达式技巧来解决它。

任何人都有经验将AWK或SED中的记录/行除以多行代替新行字符?

非常感谢!

3 个答案:

答案 0 :(得分:2)

我绝对不会建议将正则表达式作为解析任意XML或HTML的一般方法,但由于你说这是格式良好的,所以在这种情况下usual warning可能会被忽略:

sed -n '/^<url>$/{n;N;N;N;s/\n/ /g;s/ *<[a-z]*>//g;s/<\/[a-z]*>/ /g;p}'

这是一个注释版本,解释了发生了什么:

sed -n '/^<url>$/ {  # if this line contains only <url>
  n;N;N;N              # read the next 4 lines into the pattern space
  s/\n//g              # remove newlines
  s/ *<[a-z]*>//g      # remove opening tags and the spaces before them
  s/<\/[a-z]*>/ /g     # replace closing tags with a space
  p                    # print the pattern space
}' test.txt

-n选项禁止自动打印模式空间。

答案 1 :(得分:1)

sed是一个很好的工具,可以在一行上进行简单的替换,其他任何东西只需使用awk:

$ awk -F'[<>]' '
    /^<\/url>/ { inUrl=0; print line }
    inUrl      { line = line (line?" ":"") $3 }
    /^<url>/   { inUrl=1; line="" }
' file
http://www.A.com/a 2013-08-01 weekly 0.6
http://www.A.com/b 2013-08-01 weekly 0.6

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '/^<url>/!d;:a;N;/<\/url>/!ba;s/<[^>]*>\s*<[^>]*>/ /g;s/^ \| $//g' file

在模式空间中收集url行,用空格替换标记并删除前导和尾随空格。所有其他行都将被删除。

如果您知道url代码之间只有4行:

sed '/^<url>/!d;N;N;N;N;s/<[^>]*>\s*<[^>]*>/ /g;s/^ \| $//g' file