Чтение gz / gzip XML Карта сайта в Python - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь прочитать gzipped XML карту сайта на pandas. Запросы должны иметь возможность обрабатывать gzip автоматически, и в заголовках gzip обнаруживается, но с gzip он не работает, показывая «не правильно сформирован (неверный токен): строка 1, столбец 0», но карта сайта выглядит хорошо для меня?

import requests
import pandas as pd
import xmltodict
import numpy as np

url = "https://www.blick.ch/article.xml"
res = requests.get(url)
raw = xmltodict.parse(res.text)

dfAllLocs = pd.DataFrame({'loc': []})

for r in raw["sitemapindex"]["sitemap"]:
    #try: 
        print(r["loc"])
        resSingle = requests.get(r["loc"])
        #print(resSingle.headers)

        rawSingle = xmltodict.parse(resSingle.text, encoding='utf-8')
        dataSingle = [[rSingle["loc"]] for rSingle in rawSingle["urlset"]["url"]]
        dfSingle = pd.DataFrame(dataSingle, columns=["loc"])
        dfAllLocs = pd.concat([dfAllLocs,dfSingle])
        print(len(dfAllLocs))
    #except:
    #    print("something went wrong at: " + r["loc"])

1 Ответ

0 голосов
/ 12 апреля 2020

Спасибо Ионут Тикус. Эта ссылка была очень полезной Возникли проблемы при получении запросов == 2.7.0 для автоматической распаковки gzip

Работает сейчас

#Get Sitemap
url = 'https://www.watson.ch/sitemap.xml'
pattern = '(.*?)\/'
maxSubsitemapsToCrawl = 10

res = requests.get(url)
raw = xmltodict.parse(res.text)

dfSitemap = pd.DataFrame({'loc': []})

breakcounter = 0
for r in raw["sitemapindex"]["sitemap"]:
    try: 
        print(r["loc"])
        resSingle = requests.get(r["loc"], stream=True)
        if resSingle.status_code == 200:
            if resSingle.headers['Content-Type'] == 'application/x-gzip':
                resSingle.raw.decode_content = True
                resSingle = gzip.GzipFile(fileobj=resSingle.raw)
            else: 
                resSingle = resSingle.text

            rawSingle = xmltodict.parse(resSingle)
            dataSingle = [[rSingle["loc"]] for rSingle in rawSingle["urlset"]["url"]]
            dfSingle = pd.DataFrame(dataSingle, columns=["loc"])
            dfSitemap = pd.concat([dfSitemap,dfSingle])
            print(len(dfSitemap))
    except:
        print("something went wrong at: " + r["loc"])

    breakcounter += 1
    if breakcounter == maxSubsitemapsToCrawl:
        break
...