Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2015 20:13:30

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

Как выводить названия именно кирилицей??
Можно ли в цикле “ловить” определенную кодировку?
Уже час думаю - пока ничего(

Офлайн

#2 Фев. 19, 2015 20:59:20

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Создание парсера

Вот так будет кириллица

response = requests.get(url)
html = response.content.decode('utf-8')



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Офлайн

#3 Фев. 19, 2015 22:25:35

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

я не знаю как именно вычленить Description из
<a href “URL”> Название жанра </a>
Подскажите , как можно его вычленить))

Можно ли сделать фильтрацию/поиск по кодировке??

Отредактировано sourser (Фев. 19, 2015 23:07:48)

Офлайн

#4 Фев. 20, 2015 16:14:25

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Создание парсера

bs=bs4.BeautifulSoup(html)
result=[]
for i in bs.find_all(class_= 'b-list-links'):
    for j in i.find_all('a'):
        result.append(j.text)

И что вы там хотите с кодирвокой сделать?



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Отредактировано Alex_HH (Фев. 20, 2015 16:16:02)

Офлайн

#5 Фев. 20, 2015 18:15:04

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

Моя задача вывести:
Название жанра
Ссылку на жанр

ссылка на заданиеYour text to link here…
И я никак не могу вывести название жанров на кирилице.
Решение, чтобы добраться до названия

import requests
from bs4 import BeautifulSoup
r = requests.get("http://fs.to/video/films/group/film_genre/")
responce = r.content
page = BeautifulSoup(responce)
for tag in page.findAll('li'):
	a=tag.find('a')
	print a
тип елемента ‘a’:
type(a)
#<class 'bs4.element.Tag'>


Это выводит:
<a href="/video/films/film_genre/anime/">Аниме</a>
….
<a href="/video/films/film_genre/erotika/">Эротика</a>



Когда вместо
print a
пишу
print a.contents

выводит:
[u'\u0410\u043d\u0438\u043c\u0435']
....
[u'\u042d\u0440\u043e\u0442\u0438\u043a\u0430']
Это я и не могу перекодировать

А так же, если поменять вначале
responce = r.content
на
responce = r.text
,
то при решении кодировка будет другой:
[u'\xd0\x90\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb5']
...
[u'\xd0\xad\xd1\x80\xd0\xbe\xd1\x82\xd0\xb8\xd0\xba\xd0\xb0']


Есть ли способ другой сразу выводить?? Пробовал ещё несколько способов при них выводило ошибки, вроде:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-4: ordinal not in range(128)

Output is not utf-8

А так же , когда я писал tag.attr - мне показывало пустой словарь(dictionary)
r = requests.get("http://fs.to/video/films/group/film_genre/")
responce = r.content
page = BeautifulSoup(responce)
tag = page.li
print tag.attrs
>>>{}

Отредактировано sourser (Фев. 20, 2015 18:21:48)

Офлайн

#6 Фев. 20, 2015 18:50:53

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Создание парсера

import requests
from bs4 import BeautifulSoup
 
 
r = requests.get("http://fs.to/video/films/group/film_genre/")
responce = r.content.decode('utf-8')
page = BeautifulSoup(responce)
 
for tag in page.findAll('li'):
    a = tag.find('a')
    print('%s - %s' % (a.get('href'), a.text))

Вывод
/video/films/film_genre/anime/ - Аниме
/video/films/film_genre/biografiya/ - Биография
/video/films/film_genre/bojevik/ - Боевик
/video/films/film_genre/vestern/ - Вестерн
/video/films/film_genre/vojennyj/ - Военный
/video/films/film_genre/detektiv/ - Детектив
/video/films/film_genre/detskij/ - Детский
/video/films/film_genre/dokumentalnyj/ - Документальный
/video/films/film_genre/drama/ - Драма
/video/films/film_genre/istoriya/ - История
/video/films/film_genre/komediya/ - Комедия
/video/films/film_genre/korotkometrazhka/ - Короткометражка
/video/films/film_genre/kriminal/ - Криминал
/video/films/film_genre/melodrama/ - Мелодрама
/video/films/film_genre/mistika/ - Мистика
/video/films/film_genre/muzikl/ - Мюзикл
/video/films/film_genre/nuar/ - Нуар
/video/films/film_genre/priklucheniya/ - Приключения
/video/films/film_genre/semejnyj/ - Семейный
/video/films/film_genre/triller/ - Триллер
/video/films/film_genre/uzhasy/ - Ужасы
/video/films/film_genre/fantastika/ - Фантастика
/video/films/film_genre/fentezi/ - Фэнтези
/video/films/film_genre/erotika/ - Эротика

Или чтоб был абсолютный юрл.
Но правильно собирать юрлы с помощью urllib.parse.urljoin
import requests
from bs4 import BeautifulSoup
 
 
r = requests.get("http://fs.to/video/films/group/film_genre/")
responce = r.content.decode('utf-8')
page = BeautifulSoup(responce)
 
for tag in page.findAll('li'):
    a = tag.find('a')
    print('http://fs.to%s - %s' % (a.get('href'), a.text))

вывод
http://fs.to/video/films/film_genre/anime/ - Аниме
http://fs.to/video/films/film_genre/biografiya/ - Биография
http://fs.to/video/films/film_genre/bojevik/ - Боевик
http://fs.to/video/films/film_genre/vestern/ - Вестерн
http://fs.to/video/films/film_genre/vojennyj/ - Военный
http://fs.to/video/films/film_genre/detektiv/ - Детектив
http://fs.to/video/films/film_genre/detskij/ - Детский
http://fs.to/video/films/film_genre/dokumentalnyj/ - Документальный
http://fs.to/video/films/film_genre/drama/ - Драма
http://fs.to/video/films/film_genre/istoriya/ - История
http://fs.to/video/films/film_genre/komediya/ - Комедия
http://fs.to/video/films/film_genre/korotkometrazhka/ - Короткометражка
http://fs.to/video/films/film_genre/kriminal/ - Криминал
http://fs.to/video/films/film_genre/melodrama/ - Мелодрама
http://fs.to/video/films/film_genre/mistika/ - Мистика
http://fs.to/video/films/film_genre/muzikl/ - Мюзикл
http://fs.to/video/films/film_genre/nuar/ - Нуар
http://fs.to/video/films/film_genre/priklucheniya/ - Приключения
http://fs.to/video/films/film_genre/semejnyj/ - Семейный
http://fs.to/video/films/film_genre/triller/ - Триллер
http://fs.to/video/films/film_genre/uzhasy/ - Ужасы
http://fs.to/video/films/film_genre/fantastika/ - Фантастика
http://fs.to/video/films/film_genre/fentezi/ - Фэнтези
http://fs.to/video/films/film_genre/erotika/ - Эротика



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Отредактировано Alex_HH (Фев. 20, 2015 19:00:22)

Офлайн

#7 Фев. 20, 2015 21:24:09

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

Результат 1 кода:

Traceback (most recent call last):
  File "C:\Python27\IT\bs.py", line 11, in <module>
    print('%s - %s' % (a.get('href'), a.text))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-37: ordinal not in range(128)
[Finished in 2.5s]

Результат второго:
Traceback (most recent call last):
  File "C:\Python27\IT\bs.py", line 11, in <module>
    print('http://fs.to%s - %s' % (a.get('href'), a.text))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-49: ordinal not in range(128)
[Finished in 2.3s]

У меня Python 2.7.9

Объясните пожалуйста
    print('%s - %s' % (a.get('href'), a.text))
и
print('http://fs.to%s - %s' % (a.get('href'), a.text))
Ну или подскажите,какой раздел документации читать)

Офлайн

#8 Фев. 20, 2015 21:33:34

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Создание парсера

Право не знаю с кодировкой как быть, у меня питон 2.7.3, так что я не могу тут помочь.
По поводу вывода, это называется форматирование строк, где в документации почитать не знаю, но вот тут думаю можно глянуть.

Ах да, в начале файла укажите кодировку

# -*- coding: utf-8 -*-



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Отредактировано Alex_HH (Фев. 20, 2015 21:35:19)

Офлайн

#9 Фев. 21, 2015 01:06:25

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

с указанием кодировки ничего не изменилось(

Офлайн

#10 Фев. 21, 2015 11:48:37

sourser
Зарегистрирован: 2015-02-16
Сообщения: 18
Репутация: +  0  -
Профиль  

Создание парсера

Подскажите в чем камень преткновения)
В 3-х “интерпретаторах” три разных результата!
Вот код:

import requests
from bs4 import BeautifulSoup
r = requests.get("http://fs.to/video/films/group/film_genre/")
responce = r.content
page = BeautifulSoup(responce)
for tag in page.findAll('li'):
	a=tag.find('a')
	for b in a.contents:
		print b.string


1.Когда я запускаю программу с командной строки выводит желаемый результат - все жанры на русском.
Тут результат



2.Когда запускаю с интерпретатора на SublimeText3 выводит ошибку:
Traceback (most recent call last):
  File "C:\Python27\IT\hi.py", line 12, in <module>
    print b.string
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
[Finished in 3.3s]

3.Когда запускаю с IDLE Python 2.7.9 вообще выводит ошику:
Traceback (most recent call last):
  File "C:\Python27\IT\hi.py", line 12, in <module>
    print b.string
  File "C:\Python27\lib\idlelib\PyShell.py", line 1353, in write
    s = unicode.__getslice__(s, None, None)
TypeError: an integer is required

Объясните пожалуйста - почему так?

Отредактировано sourser (Фев. 21, 2015 11:50:18)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version