快速解析网站地图

2024-06-25 23:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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标签,打印到屏幕上

^{pr2}$

我使用的方法是Python BeautifulSoup来解析标记,但是,性能非常慢,因为那里有30多个文件,每个文件有300000行。我想知道是否有可能使用一些shell AWK或SED来实现这一点,或者。。我只是用了错误的工具。在

由于站点地图的格式非常好,可能有一些正则表达式技巧可以绕过它。在

有谁有在AWK或SED中用多行而不是新行字符来划分记录/行的经验吗?在

非常感谢!在


Tags: 文件comhttpurl站点www地图sed
3条回答

这可能对您有用(GNU-sed):

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

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

如果您知道url标记之间只有4行:

^{pr2}$

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

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

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

下面是一个注释版本,解释了正在发生的事情:

^{pr2}$

-n选项禁止图案空间的自动打印。在

相关问题 更多 >