Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2015 19:06:00

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг и кодировка

Добрый вечер и с наступившей пятницей!

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

Парсю таким кодом

def prepare_content(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    response = requests.get(url, headers=headers)
    tree = fromstring(response.text)
    tree.make_links_absolute(response.url)
    return tree

Нужно обработать “date”:
    date = tree.xpath('.//div[@class="h3"]/text()')[1].strip().split(',')[0]
    print(date) # 'Ночь c 27 ноября на 28 ноября'
    if 'Ночь с' in date:
        date = ' '.join(a.split()[-2:])

Не срабатывает “if ‘Ночь с’ in date”.

Делаю проверку:
1) Копирую ‘Ночь c 27 ноября на 28 ноября’ и оставляю из нее только ‘Ночь c’
2) Руками на клаве набираю ‘Ночь с’
Делаю п1 == п2 аля ‘Ночь c’ == ‘Ночь c’ и получаю False!

Делаю проверку №2, беру оба раза ‘Ночь c’ с фразы ‘Ночь c 27 ноября на 28 ноября’, сравниваю и получаю True.

С этого же сайта получаю другую строку:
movie = tree.xpath('.//h2/a/text()')[0]
print(movie) # 'Стажер (2015)'
Потом захотел чтото с этой строкой сделать - не получалось.
Из “результата отработки парсера” скопировал строку ‘Стажер (2015)’ и сделал х = ‘Стажер (2015)’, в итоге получил ‘Стажер\xa0(2015)’
(C “датой”, что выше, такой финт не получился)
“\xa0” - у меня и на других сайтах вылазит Я знаю, что это “пробел”.

Гуглил и поиском прошелся на форуме - можно чистить строки через replace или через join (strip не помогает) - но как по мне, не вариант - парсится много всего, скорость упадет. Я в кодировках плаваю… Может есть какой то вариант, чтоб засунуть в функцию prepare_content какой-то код, чтоб “чистило” всю запарсеную страницу?
Хотелось бы получать текст точно такой же, как прямо в IDE набираю, без всяких “примисей”.

Благодарю.

Отредактировано TitanFighter (Ноя. 27, 2015 19:18:32)

Офлайн

#2 Ноя. 27, 2015 19:36:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг и кодировка

TitanFighter
Делаю п1 == п2 аля ‘Ночь c’ == ‘Ночь c’ и получаю False!
Стою на асфальте я в лыжи обутый



Офлайн

#3 Ноя. 27, 2015 20:27:20

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг и кодировка

Вот и я в итоге в лыжи обутый)
Попробуем еще раз по-другому)

То что вы показали, я тоже сделал во второй проверке (чтоб убедится что крыша совсем у меня не поехала).
А когда я делал первый раз проверку, я:
а) написал с клавы “ ‘Ночь с’ == ”
б) скопировал строку ‘Ночь c 27 ноября на 28 ноября’ из результата print(date), вставил после ‘==’ из п1, убрал лишнее (т.е. “ 27 ноября на 28 ноября”).
В итоге получилось ‘Ночь с’ == ‘Ночь с’ и оно нифига не True.

Опять же, я в кодировках не бум-бум, но как я могу предполагать, в парсинге кодировка отличается от той, что используется в IDLE, и когда я скопировал результат выполнения print, я скопировал текст с одной кодировкой, а когда написал с клавы, то кодировка используется другая. И если мое предположение правильное, прошу помочь перевести запарсеный текст в кодировку IDLE.

Упростим:

date = day.xpath('.//div[@class="h3"]/text()')[1].strip().split(',')[0]
print('date:', date)
print("'Ночь с' in date:", 'Ночь с' in date)
if 'Ночь с' in date:
    date = ' '.join(a.split()[-2:])
print('date:', date)
###########
date: Ночь c 27 ноября на 28 ноября
'Ночь с' in date: False
date: Ночь c 27 ноября на 28 ноября

Отредактировано TitanFighter (Ноя. 27, 2015 21:15:18)

Офлайн

#4 Ноя. 28, 2015 07:41:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсинг и кодировка



Офлайн

#5 Ноя. 28, 2015 11:35:15

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг и кодировка

Я понимаю, что вы мне показываете. Я уже 2 раза сказал, что если с клавы набрать то, что и вы, то все нормально. С запарсенными данными такое не проходит.

Причина оказалась проста:
print(“'Ночь с (c rus)' in date:”, ‘Ночь с’ in date) # False
print(“'Ночь c (c eng)' in date:”, ‘Ночь c’ in date) # True

Отредактировано TitanFighter (Ноя. 28, 2015 11:51:15)

Офлайн

#6 Дек. 13, 2015 20:55:37

Pytonist
Зарегистрирован: 2015-05-27
Сообщения: 36
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг и кодировка

Всем здрасте.
Есть файл со списком УРЛов, которые нужно открывать поочерездно и парсить оттуда текст
Есть вот такой нехитрый код:

with open("urls.txt", "r", encoding="???") as text:
    get = text.read()
    urls_list = get.split(",")
    for url in urls_list:
        html = urlopen(url).read()
        soup = BeautifulSoup(html, "lxml")                                      
        for tag in soup.find_all("p"):
            print(tag.text)

Для проверки результата использую print() и постоянно получаю ошибку связанную с кодировкой. Перепробовал разные варианты кодировок и всегда вылазит ошибка. Подскажите что не так? Убил уже на это кучу времени.
Спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version