原创 

python3 ElementTree 生成SEO站点地图sitemap.xml

分类:python    527人阅读    IT小君  2020-11-04 22:52

1、什么是站点地图(引用自百度百科)

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。


2、站点地图的xml格式,如下

<?xml version="1.0" encoding="utf-8"?>
<urlset>
    <url>
        <!--必填,URL链接地址,长度不得超过256字节-->
        <loc>http://www.yoursite.com/yoursite.html</loc>
	<!--可以不提交该标签,用来指定该链接的最后更新时间-->
        <lastmod>2009-12-14</lastmod>
        <!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率:always ,hourly ,daily ,weekly ,monthly ,yearly ,never  -->
        <changefreq>daily</changefreq>
        <!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间-->
        <priority>0.8</priority>
    </url>
</urlset>

其中除了loc 的url地址必填外其他的都可以不填


3、使用python3 ElementTree生成站点地图

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import os
import time
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import ElementTree
import xml.etree.ElementTree as ET

#用于美化xml格式
def prettyXml(element, indent, newline, level = 0):
    # 判断element是否有子元素
    if element:
        # 如果element的text没有内容
        if element.text == None or element.text.isspace():
            element.text = newline + indent * (level + 1)
        else:
            element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)
    # 此处两行如果把注释去掉,Element的text也会另起一行
    #else:
        #element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level
    temp = list(element) # 将elemnt转成list
    for subelement in temp:
        # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
        if temp.index(subelement) < (len(temp) - 1):
            subelement.tail = newline + indent * (level + 1)
        else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个
            subelement.tail = newline + indent * level
        # 对子元素进行递归操作
        prettyXml(subelement, indent, newline, level = level + 1)


def addSiteMapNode(urls):
    name = "sitemap.xml"
    tree = None
    root = None

    ET.register_namespace('', "http://www.sitemaps.org/schemas/sitemap/0.9")
    if os.path.isfile(name):
        tree = ElementTree()
        tree.parse(name)
        root = tree.getroot()
    else:
        root = Element('urlset', attrib={"xmlns":"http://www.sitemaps.org/schemas/sitemap/0.9"})
        tree = ElementTree(root)

    for url in urls:
        urlNode = SubElement(root, 'url')
        loc = SubElement(urlNode, 'loc')
        loc.text = url
        lastmod = SubElement(urlNode, 'lastmod')
        lastmod.text = time.strftime('%Y-%m-%dT%H:%M:%S:%SZ', time.localtime())
        changefreq = SubElement(urlNode, 'changefreq')
        changefreq.text = 'weekly'
        priority = SubElement(urlNode, 'priority')
        priority.text = '0.8'
    prettyXml(tree.getroot(), '\t', '\n')
    tree.write(name, encoding='utf-8',xml_declaration=True)

if __name__ == '__main__':
    urls = ['http://www.baidu.com'] * 2
    addSiteMapNode(urls)
    urls = ['http://yy123.ink'] * 2
    addSiteMapNode(urls)

遇到的坑

1、ElementTree生成的xml是一行,需要格式化,添加了prettyXml方法

2、ElementTree读取文件保存后出现ns0 命名空间,使用ET.register_namespace默认命名空间,

3、'ElementTree' object has no attribute 'register_namespace' ET是模块不是ElementTree类  

4、missing 1 required positional argument: 'source'” while arg is present  , ElementTree.parse需要先创建一个对象

5、文件没有<?xml version='1.0' encoding='utf-8'?> 写入的时候添加 tree.write(name, encoding='utf-8',xml_declaration=True)


生成的结果如下:

<?xml version='1.0' encoding='utf-8'?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>http://www.baidu.com</loc>
		<lastmod>2020-11-04T21:51:32:32Z</lastmod>
		<changefreq>weekly</changefreq>
		<priority>0.8</priority>
	</url>
	<url>
		<loc>http://www.baidu.com</loc>
		<lastmod>2020-11-04T21:51:32:32Z</lastmod>
		<changefreq>weekly</changefreq>
		<priority>0.8</priority>
	</url>
	<url>
		<loc>http://yy123.ink</loc>
		<lastmod>2020-11-04T21:51:32:32Z</lastmod>
		<changefreq>weekly</changefreq>
		<priority>0.8</priority>
	</url>
	<url>
		<loc>http://yy123.ink</loc>
		<lastmod>2020-11-04T21:51:32:32Z</lastmod>
		<changefreq>weekly</changefreq>
		<priority>0.8</priority>
	</url>
</urlset>


结语:

本文介绍了站点地图sitemap的含义及作用,分析了站点地图xml结构及各节点含义。展示了python3 ElementTree生成站点地图的源代码实例Demo。希望对您有帮助。







支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

 工具推荐 更多»