urlopen душит меня с newlines

Я соскребаю простые текстовые файлы с url.

def scrape_contents_ex(url):
    data = urllib2.urlopen(url)
    return data.read() 

Проблема в том, что строка, которую она выдает, забита символами новой строки и табуляции «t», «r» и т. д.

Образец:

Вот веб-страница
Введите описание изображения здесь

Когда я печатаю вывод строки в python, он отрисовывается с различными символами :

Введите описание изображения здесь

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

Как правильно и надежно читать и хранить это?

3 ответа

  1. Вы можете использовать str.split () метод, хотя есть много вариантов для решения этой конкретной проблемы.

    Из python 3.5.1 docs:

    >>> '1,2,3'.split(',')
    ['1', '2', '3']
    >>> '1,2,3'.split(',', maxsplit=1)
    ['1', '2,3']
    >>> '1,2,,3,'.split(',')
    ['1', '2', '', '3', '']
    

    Вы хотели бы что-то вроде

    return data.read().split('\n\t')
    

    Результатом является список строк, встречающихся между любыми экземплярами ‘\n\t ‘ в исходной строке.

  2. foo является bytestring в вашем случае. Если он представляет собой текст, его следует декодировать в Юникод перед сохранением в PostgreSQL: text = foo.decode(character_encoding)набор символов может зависеть от типа контента. Смотрите хороший способ получить кодировку HTTP-ответа в Python .

    Затем вы вводите fooзапрос, ipythonпытается отобразить fooобъект, и он может вызвать repr(foo).

    Что вы видите: "a\nb"(результат repr()вызова) — это печатаемое представление объекта Python с типом str(type(foo) == str). Строковые литералы Python используют тот же синтаксис. Обратная косая черта является специальной внутри строковых литералов, например, "\n"один символ (новая строка— ord("\n") == 10). Если вы хотите создать строку, которая содержит два символа: backslash + nто вы должны избежать обратной косой черты или использовать необработанные строковые литералы:

    >>> "\n" == r"\n" != "\n"
    True