用Python解析此XML网站地图的最有效方法是什么?

时间:2019-03-15 02:08:54

标签: python xml sitemap

我尝试解析以下站点地图:

<?xml version="1.0" encoding="UTF-8"?> 
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url> 
      <loc>https://www.example.com/examplea</loc> 
      <priority>0.5</priority> 
      <lastmod>2019-03-14</lastmod> 
      <changefreq>daily</changefreq> 
   </url> 
   <url> 
     <loc>https://www.example.com/exampleb</loc> 
     <priority>0.5</priority> 
     <lastmod>2019-03-14</lastmod> 
     <changefreq>daily</changefreq> 
   </url> 
</urlset>

使用Python在loc标记内获取url链接的最快方法是什么?

我尝试使用ElementTree,但是由于名称空间,我认为它无法正常工作。

我需要获取“ https://www.example.com/examplea”和“ https://www.example.com/exampleab

4 个答案:

答案 0 :(得分:1)

import re

str = """
<?xml version="1.0" encoding="UTF-8"?> 
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url> 
      <loc>https://www.example.com/examplea</loc> 
      <priority>0.5</priority> 
      <lastmod>2019-03-14</lastmod> 
      <changefreq>daily</changefreq> 
   </url> 
   <url> 
     <loc>https://www.example.com/exampleb</loc> 
     <priority>0.5</priority> 
     <lastmod>2019-03-14</lastmod> 
     <changefreq>daily</changefreq> 
   </url> 
</urlset>
"""  
url = re.findall("<loc>(.*?)</loc>", str)

答案 1 :(得分:1)

您可以考虑使用正则表达式。

对于您的示例,可以通过以下代码满足您的需求:

import re

string = '''
<?xml version="1.0" encoding="UTF-8"?> 
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url> 
      <loc>https://www.example.com/examplea</loc> 
      <priority>0.5</priority> 
      <lastmod>2019-03-14</lastmod> 
      <changefreq>daily</changefreq> 
   </url> 
   <url> 
     <loc>https://www.example.com/exampleb</loc> 
     <priority>0.5</priority> 
     <lastmod>2019-03-14</lastmod> 
     <changefreq>daily</changefreq> 
   </url> 
</urlset>
'''

pattern = '(?<=<loc>)[a-zA-z]+://[^\s]*(?=</loc>)'

re.findall(pattern,string)

结果为['https://www.example.com/examplea', 'https://www.example.com/exampleb']

答案 2 :(得分:0)

正如其他答案所述,您可以使用正则表达式。但是,如果您对使用正则表达式感到有点不舒服,则还可以在python中使用xmltodict模块,该模块将xml转换为字典,并且可以轻松地从xml中获取所需的任何类型的数据。

答案 3 :(得分:0)

使用XML但绕过命名空间

from StringIO import StringIO
import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="UTF-8"?> 
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url> 
      <loc>https://www.example.com/examplea</loc> 
      <priority>0.5</priority> 
      <lastmod>2019-03-14</lastmod> 
      <changefreq>daily</changefreq> 
   </url> 
   <url> 
     <loc>https://www.example.com/exampleb</loc> 
     <priority>0.5</priority> 
     <lastmod>2019-03-14</lastmod> 
     <changefreq>daily</changefreq> 
   </url> 
</urlset>'''

it = ET.iterparse(StringIO(xml))
for _, el in it:
    if '}' in el.tag:
        el.tag = el.tag.split('}', 1)[1]  # strip all namespaces
    for at in el.attrib.keys(): # strip namespaces of attributes too
        if '}' in at:
            newat = at.split('}', 1)[1]
            el.attrib[newat] = el.attrib[at]
            del el.attrib[at]
root = it.root

urls = [u.text for u in root.findall('.//loc')]
print(urls)

输出

['https://www.example.com/examplea', 'https://www.example.com/exampleb']