Galvanize
Фев. 1, 2014 07:02:06
Приветствую.
Столкнулся с проблемой, не знаю как решить.
Имеется html страница, где есть ссылки с такими вот src
/ololo/leaders.php
/ololo/leaders.php?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8
/ololo/leaders.php?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8
Хотелось бы узнать, как можно дописать в конце каждой из них строку ‘.html’.
re.sub() и .replace() не помогают, т.к. первая строка входит в состав 2-ой и 3-ей, и получается не то, что надо.
Спасибо.
PanovSergey
Фев. 1, 2014 11:45:25
Galvanize
Фев. 1, 2014 14:56:16
И как это можно применить?
Galvanize
Фев. 1, 2014 15:25:04
Объясню немного подробнее.
Имеет html страницу, в которой есть ссылки вида:
/ololo/about.php
/ololo/contact.php
/ololo/leaders.php
/ololo/leaders.php?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8
/ololo/leaders.php?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8
…
я их паршу со странички, и помещаю в массив. Потом перебирая элементы массива подставляю к ссылкам ‘.html’, и меняю прежние ссылки в коде странички на новые. Всё бы ничего, но когда подходит очередь кода, вида
old_url = ‘/ololo/leaders.php’
new_url = old_url + ‘.html’
html_code.replace(old_url, new_url)
то ссылки
/ololo/leaders.php?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8
/ololo/leaders.php?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8
меняются на
/ololo/leaders.php.html?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8
/ololo/leaders.php.html?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8
Как можно поменять ссылки, без подобных косяков?
PanovSergey
Фев. 1, 2014 15:50:04
И как это можно применить?
разобрать url на компоненты изменить нужный вам собрать снова, не надо регепсами или replace этого делать есть стандартная библиотека
Galvanize
Фев. 1, 2014 16:06:37
Разложить урл на части я могу и обычным сплитом =), это не проблема.
Мне не понятно как Вы предлагаете мне заменить уже измененные урлы в коде страницы?
Вот, имеем код:
import re
import urlparse
html = """
<html>
<body>
<a href="../ololo/leaders.php"></a>
<a href="../ololo/leaders.php?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8"></a>
<a href="../ololo/leaders.php?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8"></a>
</body>
</html>
"""
#парсим урлы
urls = re.compile('<a href="(.*?)"', re.DOTALL).findall(html)
# urls = ['../ololo/leaders.php', '../ololo/leaders.php?pageNum_rs_getpositions=0&totalRows_rs_getpositions=8',
#'../ololo/leaders.php?pageNum_rs_getpositions=1&totalRows_rs_getpositions=8']
for url in urls:
#что дальше?
kise97
Фев. 1, 2014 16:36:51
Вам предлагают сделать по-умному, фактически W.W.J.D.
Вот вам вариант, без urlparse
re.sub('(\d)"></a>', '\\1.html"></a>', html)
re.sub('(\d)"></a>', '$1.html"></a>', html)
Galvanize
Фев. 1, 2014 16:56:23
kise97, спасибо, но Ваш пример не делает того, что требуется. И да, у вас идет привязка к цифре в параметрах строки. Если её там не будет, то пример не сработает.
Мне нужен универсальный способ.
Как по-умному? urlparse только разложит урл на части, что я и без его помощи давно сделал. Вопрос не в том как разложить и подставить .html, а в том как мне изменить старые урлы на новые (которые я уже давно получил) без конфликта, который дает re.sub и .replace?
В моем примере, в списке первой идет ‘/ololo/leaders.php’, и если её заменить в html на ‘/ololo/leaders.php.html’ то и в ссылках содержащих ‘/ololo/leaders.php’ она тоже поменяется и получится полная лажа.
Для данного примера регулярка будет такая re.sub('(.*)“></a>', ‘\\1.html”></a>’, html). Мне это не помогло, т.к. я привел не совсем корректный пример. В реальном html-коде будет много чего левого подходящего под условия регэкспа.
PanovSergey
Фев. 1, 2014 17:30:43
Мне не понятно как Вы предлагаете мне заменить уже измененные урлы в коде страницы?
Смотрите
lxmlМожно еще юзать BeautifulSoup но он вроде как не особо.
Можно еще написать sax. Но это сильно много работы.
Есть еще вот такая штука
scrapy Но она для разбора, думаю вам позже пригодится.
Galvanize
Фев. 1, 2014 17:48:09
Что именно мне там искать? Вы можете привести хотя бы один работающий пример?
Мне не нужны парсеры. Мне нужен способ поменять урлы безболезненным для моего случая способом.