Разбор html-файла и добавление найденных изображений в zip-файл - PullRequest
2 голосов
/ 23 декабря 2009

Я пытаюсь разобрать html для всех его тегов img, загрузить все изображения, на которые указывает src, и затем добавить эти файлы в zip-файл. Я предпочел бы делать все это в памяти, поскольку могу гарантировать, что изображений будет не так много.

Предположим, что переменная images уже заполнена при разборе html. Мне нужна помощь с получением изображений в zip-файл.

from zipfile import ZipFile
from StringIO import StringIO
from urllib2 import urlopen

s = StringIO()
zip_file = ZipFile(s, 'w')
try:
    for image in images:
        internet_image = urlopen(image)
        zip_file.writestr('some-image.jpg', internet_image.fp.read())
        # it is not obvious why I have to use writestr() instead of write()
finally:
    zip_file.close()

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Самый простой способ сделать это - использовать библиотеку BeautifulSoup.

Что-то вроде:

from BeautifulSoup import BeautifulSoup
from collections import defaultdict

def getImgSrces(html):
    srcs = []
    soup = BeautifulSoup(html)

    for tag in soup('img'):
        attrs = defaultdict(str)
        for attr in tag.attrs:
            attrs[ attr[0] ] = attr[1]
        attrs = dict(attrs)

        if 'src' in attrs.keys():
            srcs.append( attrs['src'] )

    return srcs

Это должно дать вам список URL-адресов, полученных из ваших тегов img для циклического прохождения.

1 голос
/ 23 декабря 2009

Чтобы ответить на ваш конкретный вопрос о том, как вы создаете ZIP-архив (другие обсуждали здесь разбор URL-адресов), я протестировал ваш код. Вы действительно замечательно близки к тому, чтобы уже иметь готовый продукт.

Вот как я могу дополнить то, что вам нужно для создания архива Zip (в этом примере я записываю архив на диск, чтобы убедиться, что он записан правильно).

from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED
import zlib
from cStringIO import StringIO
from urllib2 import urlopen
from urlparse import urlparse
from os import path

images = ['http://sstatic.net/so/img/logo.png', 
          'http://sstatic.net/so/Img/footer-cc-wiki-peak-internet.png']

buf = StringIO()
# By default, zip archives are not compressed... adding ZIP_DEFLATED
# to achieve that. If you don't want that, or don't have zlib on or
# system, delete the compression kwarg
zip_file = ZipFile(buf, mode='w', compression=ZIP_DEFLATED)

for image in images:
    internet_image = urlopen(image)
    fname = path.basename(urlparse(image).path) 
    zip_file.writestr(fname, internet_image.read())

zip_file.close()

output = open('images.zip', 'wb')
output.write(buf.getvalue())
output.close()
buf.close()
1 голос
/ 23 декабря 2009

Я не совсем уверен, что вы спрашиваете здесь, так как вы, кажется, сортировали большую часть этого

Вы исследовали HtmlParser для фактического выполнения анализа HTML? Я бы не стал пытаться свернуть парсер вручную - это серьезная задача с многочисленными крайними случаями. Даже не думайте о регулярных выражениях ни для чего, кроме самых тривиальных случаев.

Для каждого тега <img/> вы можете использовать HttpLib , чтобы фактически получить каждое изображение. Возможно, стоит получить изображения в несколько потоков, чтобы ускорить компиляцию zip-файла.

...