1

www.example.com/sitemap.xml.gz のような圧縮されたサイトマップを解析し、sitemap.xml.gz をダウンロードせずにサイトマップ内のすべての URL を収集したいと考えています。

sitemap.xml.gz をダウンロードし、lxmlまたはbeautifulsoupなど を使用して解凍した後に解析する方法があります。

def parse_sitemap_gz(url):
    r = requests.get(url, stream=True)
    if 200 != r.status_code:
    return False
    file_name = url.split('/')[-1]

    # download the sitemap file
    with open(file_name, 'wb') as f:
    if not r.ok:
        print 'error in %s'%(url)
    for block in r.iter_content(1024):
        if not block:
           break
        f.write(block) # can I parse it without writing to file
        f.flush()

    # decompress gz file
    subprocess.call(['gunzip', '-f', file_name])

    # parse xml file
    page = lxml.html.parse(file_name[0:-3])
    all_urls = page.xpath('//url/loc/text()')
    #print all_urls

    # delete sitemap file now
    subprocess.call(['rm', '-rf', file_name[0:-3]])
    return all_urls

このコードでは、圧縮されたサイトマップをファイルに書き込んでいます。私の意図は、ファイルに何も書き込まないことです。
上記のコードのインテリジェントなバージョンを学習および作成するために、ファイルをダウンロードしたりファイルに書き込んだりする必要がないように、gzip ストリームを解凍するという概念を使用して解析するにはどうすればよいですか?

4

2 に答える 2

9

gunzip唯一の要件がディスクへの書き込みではなく、gzip されたファイルに、ユーティリティのみがサポートし、メモリに収まる拡張子がない場合は、次から開始できます。

import requests
import gzip
from StringIO import StringIO

r = requests.get('http://example.com/sitemap.xml.gz')
sitemap = gzip.GzipFile(fileobj=StringIO(r.content)).read()

次に、そのまま解析sitemaplxmlます...

とにかく単一のリクエストでファイル全体を取得するだけでよいため、イテレータを「チャンク」しないことに注意してください。

于 2014-10-25T16:50:57.690 に答える