Pytonist
Ноя. 6, 2015 01:02:28
Подскажите пожалуйста люди добрые. Целый день сегодня потратил и толком даже не сдвинулся с места… Нужно сделать парсинг после выполнения которого, я получил два отсортированных списка. В первом списке должны быть все ссылки сервера даной страницы(внутренние). Второй список должен содержать все остальные ссылки на внешние источники.
Я так понимаю, сортировка дожна происходить по IP. Но как это реализовать? Раньше ничего подобного не делал. Какой-то вменяемой инфы не удалось найти. Вынужден обратится на форум.
Спасибо.
py.user.next
Ноя. 6, 2015 02:32:41
Нужно собрать все ссылки в один список, а потом разделить его.
afiskon
Ноя. 6, 2015 10:44:23
1) качаете страницу через urllib3
2) выдираете регулярными выражениями все урлы
3) для каждого урла - выдираете регулярным выражением домен. если домена нет или есть и это домен вашего сайта с точностью до www. в начале, кладете в список внутренних адресов. иначе в список внешних
4) сортируете списки
по каждому пункту за 5 минут гугления находится решение.
сортировка по IP не подходит так как на одном сервере может быть сотня совершенно не связанных друг с другом сайтов.
py.user.next
Ноя. 6, 2015 12:31:24
afiskon
2) выдираете регулярными выражениями все урлы
Ссылки могут быть и в комментариях, regexp их не различит.
afiskon
3) для каждого урла - выдираете регулярным выражением домен
В питоне есть urlsplit().
afiskon
кладете в список внутренних адресов. иначе в список внешних
При изменении условий (количество списков, которые нужны) придётся лезть в уже готовый код и менять его. Тогда как выделение всех ссылок и их подача на дальнейший разборщик упрощает задачу и отвязывает от источника ссылок.
Elaphe
Ноя. 6, 2015 13:30:31
А чем плохо использовать для выдирания ссылок htmlparser?
Это же намного проще, чем ломать голову с регулярными выражениями.
py.user.next
Ноя. 7, 2015 00:20:42
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()
Pytonist
Ноя. 10, 2015 23:46:44
Всем отписавшимся большое спасибо, очень помогли. Свою задачу решил с помошью lxml.
snake_eater
Ноя. 14, 2015 12:51:18
а он умеет в невалидный html ?
doza_and
Ноя. 14, 2015 15:35:05
snake_eater
а он умеет в невалидный html ?
Да только наверное из а не в?
snake_eater
Ноя. 16, 2015 07:14:05
а рано обрадовался - это веть нестандартная либа.