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。希望对您有帮助。