Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2015 01:02:28

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

Парсинг

Подскажите пожалуйста люди добрые. Целый день сегодня потратил и толком даже не сдвинулся с места… Нужно сделать парсинг после выполнения которого, я получил два отсортированных списка. В первом списке должны быть все ссылки сервера даной страницы(внутренние). Второй список должен содержать все остальные ссылки на внешние источники.
Я так понимаю, сортировка дожна происходить по IP. Но как это реализовать? Раньше ничего подобного не делал. Какой-то вменяемой инфы не удалось найти. Вынужден обратится на форум.
Спасибо.

Офлайн

#2 Ноя. 6, 2015 02:32:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг

Нужно собрать все ссылки в один список, а потом разделить его.



Офлайн

#3 Ноя. 6, 2015 10:44:23

afiskon
Зарегистрирован: 2015-11-05
Сообщения: 8
Репутация: +  1  -
Профиль  

Парсинг

1) качаете страницу через urllib3
2) выдираете регулярными выражениями все урлы
3) для каждого урла - выдираете регулярным выражением домен. если домена нет или есть и это домен вашего сайта с точностью до www. в начале, кладете в список внутренних адресов. иначе в список внешних
4) сортируете списки

по каждому пункту за 5 минут гугления находится решение.

сортировка по IP не подходит так как на одном сервере может быть сотня совершенно не связанных друг с другом сайтов.

Офлайн

#4 Ноя. 6, 2015 12:31:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг

afiskon
2) выдираете регулярными выражениями все урлы
Ссылки могут быть и в комментариях, regexp их не различит.

afiskon
3) для каждого урла - выдираете регулярным выражением домен
В питоне есть urlsplit().

afiskon
кладете в список внутренних адресов. иначе в список внешних
При изменении условий (количество списков, которые нужны) придётся лезть в уже готовый код и менять его. Тогда как выделение всех ссылок и их подача на дальнейший разборщик упрощает задачу и отвязывает от источника ссылок.



Офлайн

#5 Ноя. 6, 2015 13:30:31

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Парсинг

А чем плохо использовать для выдирания ссылок htmlparser?
Это же намного проще, чем ломать голову с регулярными выражениями.

Отредактировано Elaphe (Ноя. 6, 2015 13:31:29)

Офлайн

#6 Ноя. 7, 2015 00:20:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг

Elaphe
А чем плохо использовать для выдирания ссылок htmlparser?
В прежней версии парсер выпадал, когда встречал ошибки в html
https://docs.python.org/2/library/htmlparser.html
А ещё там надо было писать обработчики для всего, иначе, встретив charref, он тоже выпадал.

В новой версии допускается невалидный документ
https://docs.python.org/3/library/html.parser.html

>>> from html.parser import HTMLParser
>>> 
>>> class Parser(HTMLParser):
...     
...     def handle_starttag(self, tag, attrs):
...         if tag == 'a':
...             print(dict(attrs)['href'])
... 
>>> parser = Parser()
>>> parser.feed('<html><a href="x">abc</a><a href="y">abc</html>')
x
y
>>> parser.close()
>>>

Но для разбора страниц используется xpath
lxml.html + xpath()



Отредактировано py.user.next (Ноя. 7, 2015 00:47:57)

Офлайн

#7 Ноя. 10, 2015 23:46:44

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

Парсинг

Всем отписавшимся большое спасибо, очень помогли. Свою задачу решил с помошью lxml.

Офлайн

#8 Ноя. 14, 2015 12:51:18

snake_eater
Зарегистрирован: 2015-03-30
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг

lxml
а он умеет в невалидный html ?

Офлайн

#9 Ноя. 14, 2015 15:35:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Парсинг

snake_eater
а он умеет в невалидный html ?
Да только наверное из а не в?



Отредактировано doza_and (Ноя. 14, 2015 15:35:48)

Офлайн

#10 Ноя. 16, 2015 07:14:05

snake_eater
Зарегистрирован: 2015-03-30
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг

а рано обрадовался - это веть нестандартная либа.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version