Как загрузить какую-либо(!) веб-страницу корректным набором символов в Python?

То, что будет самым быстрым, зависит от того, какой процент Вашего списка является дубликатами. Если это будут почти все дубликаты с немногими уникальными объектами, то создавание нового списка, вероятно, будет быстрее. Если это будут главным образом уникальные объекты, то удалять их из исходного списка (или копия) будет быстрее.

Вот один для изменения списка на месте:

def unique(items):
  seen = set()
  for i in xrange(len(items)-1, -1, -1):
    it = items[i]
    if it in seen:
      del items[i]
    else:
      seen.add(it)

Итерация назад по индексам гарантирует, что удаление объектов не влияет на повторение.

34
задан 4 revs 4 September 2010 в 00:33
поделиться

4 ответа

instead of trying to get a page then figuring out the charset the browser would use, why not just use a browser to fetch the page and check what charset it uses..

from win32com.client import DispatchWithEvents
import threading


stopEvent=threading.Event()

class EventHandler(object):
    def OnDownloadBegin(self):
        pass

def waitUntilReady(ie):
    """
    copypasted from
    http://mail.python.org/pipermail/python-win32/2004-June/002040.html
    """
    if ie.ReadyState!=4:
        while 1:
            print "waiting"
            pythoncom.PumpWaitingMessages()
            stopEvent.wait(.2)
            if stopEvent.isSet() or ie.ReadyState==4:
                stopEvent.clear()
                break;

ie = DispatchWithEvents("InternetExplorer.Application", EventHandler)
ie.Visible = 0
ie.Navigate('http://kskky.info')
waitUntilReady(ie)
d = ie.Document
print d.CharSet
1
ответ дан 27 November 2019 в 16:45
поделиться

Используйте универсальный детектор кодирования :

>>> import chardet
>>> chardet.detect(urlread("http://google.cn/"))
{'encoding': 'GB2312', 'confidence': 0.99}

Другой вариант - просто использовать wget:

  import os
  h = os.popen('wget -q -O foo1.txt http://foo.html')
  h.close()
  s = open('foo1.txt').read()
14
ответ дан 27 November 2019 в 16:45
поделиться

Когда вы загружаете файл с urllib или urllib2, вы можете узнать, был ли передан заголовок кодировки:

fp = urllib2.urlopen(request)
charset = fp.headers.getparam('charset')

Вы можете использовать BeautifulSoup, чтобы найти метаэлемент в HTML:

soup = BeatifulSoup.BeautifulSoup(data)
meta = soup.findAll('meta', {'http-equiv':lambda v:v.lower()=='content-type'})

Если ни один из них не доступен, браузеры обычно возвращаются к пользовательской конфигурации в сочетании с автоопределением. Как предлагает rajax, вы можете использовать модуль chardet. Если у вас есть доступная пользовательская конфигурация, в которой указано, что страница должна быть китайской (скажем), вы можете сделать это лучше.

37
ответ дан 27 November 2019 в 16:45
поделиться

Похоже, вам нужен гибрид представленных ответов:

  1. Получить страницу с помощью urllib
  2. Найдите теги , используя красивый суп или другой метод
  3. Если метатеги не существуют, проверьте заголовки, возвращаемые urllib.
  4. Если это все еще не дает ответа, используйте универсальный детектор кодирования.

Честно говоря, я не верю, что вы найдете что-то лучше этого.

На самом деле, если вы прочитаете FAQ, на который вы ссылались в комментариях к другому ответу, это то, что защищает автор библиотеки детекторов.

Если вы верите в FAQ,

4
ответ дан 27 November 2019 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: