Найти - Пользователи
Полная версия: Создание парсера
Начало » Python для новичков » Создание парсера
1 2 3
sourser
Как выводить названия именно кирилицей??
Можно ли в цикле “ловить” определенную кодировку?
Уже час думаю - пока ничего(
Alex_HH
Вот так будет кириллица
response = requests.get(url)
html = response.content.decode('utf-8')
sourser
я не знаю как именно вычленить Description из
<a href “URL”> Название жанра </a>
Подскажите , как можно его вычленить))

Можно ли сделать фильтрацию/поиск по кодировке??
Alex_HH
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)

И что вы там хотите с кодирвокой сделать?
sourser
Моя задача вывести:
Название жанра
Ссылку на жанр

ссылка на задание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
>>>{}
Alex_HH
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/ - Эротика

sourser
Результат 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))
Ну или подскажите,какой раздел документации читать)
Alex_HH
Право не знаю с кодировкой как быть, у меня питон 2.7.3, так что я не могу тут помочь.
По поводу вывода, это называется форматирование строк, где в документации почитать не знаю, но вот тут думаю можно глянуть.

Ах да, в начале файла укажите кодировку
# -*- coding: utf-8 -*-
sourser
с указанием кодировки ничего не изменилось(
sourser
Подскажите в чем камень преткновения)
В 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

Объясните пожалуйста - почему так?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB