Каков наиболее эффективный способ анализа этой карты сайта XML с помощью Python? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующая карта сайта, которую я пытаюсь проанализировать:

<?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-ссылок внутри тегов loc с использованием Python?

Я пытался использовать ElementTree, но я думаю, что это не сработало из-за пространств имен.

Мне нужно получить "https://www.example.com/examplea" и" https://www.example.com/exampleab"

Ответы [ 4 ]

1 голос
/ 15 марта 2019

Вы можете использовать регулярное выражение.

Для вашего примера ваше требование может быть удовлетворено с помощью следующего кода:

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']

1 голос
/ 15 марта 2019
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)
0 голосов
/ 15 марта 2019

Использование 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']
0 голосов
/ 15 марта 2019

Как и в других ответах, вы можете использовать регулярные выражения.Но если вам немного неудобно использовать регулярные выражения, вы также можете использовать модуль xmltodict в python, который преобразует XML в словарь, и вы можете легко получать любые данные из XML.

...