Форум сайта python.su
Учусь собирать инфу по книге “Скрапинг с помощью Python”. Решил сам попрактиковаться, при скрапинге кинопоиска возникло вот такое затруднение:
from bs4 import BeautifulSoup from urllib.request import urlopen import re spisok = [] URL = urlopen('https://www.kinopoisk.ru/top/') html = BeautifulSoup(URL, 'lxml') target = html.find('table', cellspacing='0', cellpadding='3') for tr in target.findAll('tr'): for td in tr: try: a = td.text spisok.append(a) except AttributeError: continue print(spisok)
Отредактировано solovs03 (Авг. 2, 2017 21:34:30)
Офлайн
Только заметил, что существует отдельный раздел по вопросам сборам информации, извините новичка за нетерпеливость)0)101)
Офлайн
Там очень уж странная table-верстка, куча вложенных таблиц.
Вот пример вывода только названий фильмов.
from bs4 import BeautifulSoup from urllib.request import urlopen import re spisok = [] URL = urlopen('https://www.kinopoisk.ru/top/') html = BeautifulSoup(URL, 'lxml') target = html.select('table table table table')[-1] for tr in target.findAll('tr'): td = tr.findAll('td')[1] spisok.append(td.get_text()) print(spisok) print(len(spisok))
Офлайн
solovs03Это дикий текст, он всегда неудобный, и это ещё не самый худший случай. Это только в учебных текстах всегда всё удобно, потому что их готовят для читателей, чтобы они особо не заморачивались, решая задачу. Но это не всегда, конечно; бывают книги и с трудными заданиями (K&R2 - хороший пример, там много диких заданий).
У меня вопрос. С какой вороньей пи**ы Python соблюдает так много новых строк?(Не знаю как спросить по другому).
Отредактировано py.user.next (Авг. 3, 2017 03:08:56)
Офлайн
scidam
Да, это хороший способ вывести текст с одного td, но там в одном tr несколько td и без итерации не обойтись. Да и спрашивал я совсем другое.
Офлайн
py.user.next
Это связано именно с супом или же со всеми модулями парсинга? Насчёт задач это уже совсем другая тема. С детства я считал себя самым тупым в классе, всегда думал что никогда не смогу так быстро схватывать инфу, всё запоминать и т.п пока не понял что эти люди просто кивают головой когда их спрашивают. Задачи всегда были лёгкие, а проблемы с которыми ты сталкиваешься во время решения какой либо задачи были нереально трудные и ты ищешь где найти ответ пока не понимаешь что тебе надо решить задачу самому. Получай Ху*м по лбу. Насчёт очистки текста, очищать с помощью re? Или как?
Офлайн
solovs03Это на сайте так написано. Твоя задача - выбрать оттуда всё без потерь. Потом это “сырьё” обработать, чтобы получить очищенный материал (текст, без лишних символов). И дальше ты уже работаешь с этим материалом.
Это связано именно с супом или же со всеми модулями парсинга?
solovs03Очищать надо алгоритмически, где-то это re, где-то это цикл с перебором всех символов и выборкой только нужных. Да и, бывает, что нужно применять всё вместе и чистить в несколько проходов.
Насчёт очистки текста, очищать с помощью re?
>>> import re >>> >>> def clear_string(s): ... out1 = re.sub(r'\s+', ' ', s) ... out2 = out1.strip() ... return out2 ... >>> text = ('\n\n\n\xa0\nфильм\n\xa0\n\xa0\n\n\n1.\n' ... 'Побег из Шоушенка (1994)The Shawshank Redemption' ... '\xa0\n\n\n9.197 (428\xa0046)\n\n\n\n\n\xa0\n\n\n' ... '\n\n\n2.\nЗеленая миля') >>> >>> out = clear_string(text) >>> out 'фильм 1. Побег из Шоушенка (1994)The Shawshank Redemption 9.197 (428 046) 2. Зеленая миля' >>>
Отредактировано py.user.next (Авг. 3, 2017 06:50:23)
Офлайн
solovs03Ты их сам добавляешь.
С какой вороньей пи**ы Python соблюдает так много новых строк?(Не знаю как спросить по другому).
a = td.string
target = html.findAll('table', cellspacing='0', cellpadding='3') for tr in target[1].findAll('tr'): film = [] for link in tr.findAll(text=True): a = link.string if a not in [u' ', u' ', u'\n']: film.append(a) spisok.append(film) print json.dumps(film, ensure_ascii=False).encode('cp866', 'ignore') # print json.dumps(spisok, ensure_ascii=False).encode('cp866', 'ignore')
["фильм"]
["1.", "Побег из Шоушенка (1994)", "The Shawshank Redemption", "9.197", "(427 755)"]
["2.", "Зеленая миля (1999)", "The Green Mile", "9.148", "(407 218)"]
["3.", "Форрест Гамп (1994)", "Forrest Gump", "9.001", "(400 387)"]
["4.", "Список Шиндлера (1993)", "Schindler's List", "8.895", "(215 120)"]
["5.", "1+1 (2011)", "Intouchables", "8.866", "(415 927)"]
...
Офлайн
Vintets
Я писал в начале, то что я новичок в этой сфере и учусь по книге.
Vintets
… и добавляешь странный параметр ‘.text’.
VintetsВы определили его, а значит он имеется почти у каждого тега - в моём случае, а если он не имеется, для него заготовлен обработчик исключений, хотя и можно было воспользоваться конструкцией if…
for link in tr.findAll(text=True): …
Офлайн
Vintets
Насчёт string, там можно многими способами вытащить данные между тегами, есть и get_text и моим методом - с помощью параметра text и т.д
Офлайн