2016-07-23 2 views
0

Я написал код, который извлекает html-код любого данного сайта, а затем извлекает из него все ссылки и сохраняет их внутри списка. Моя цель в том, что я хочу изменить все относительные ссылки в html-файле с абсолютными ссылками.Доступ только к ссылкам с заданным форматом из списка python

Вот ссылки:

src="../styles/scripts/jquery-1.9.1.min.js" 
href="/PhoneBook.ico" 
href="../css_responsive/fontsss.css" 
src="http://www.google.com/adsense/search/ads.js" 
L.src = '//www.google.com/adsense/search/async-ads.js' 
href="../../" 
src='../../images/plus.png' 
vrUrl ="search.aspx?searchtype=cat" 

Эти несколько ссылок, которые я скопировал из HTML-файла, чтобы сохранить этот вопрос простой и менее подвержен ошибкам.

Ниже приведены различные URL-адреса, используемые в HTML файле:

http://yourdomain.com/images/example.png 
//yourdomain.com/images/example.png 
/images/example.png 
images/example.png 
../images/example.png 
../../images/example.png 

Python код:

linkList = re.findall(re.compile(u'(?<=href=").*?(?=")|(?<=href=\').*?(?=\')|(?<=src=").*?(?=")|(?<=src=\').*?(?=\')|(?<=action=").*?(?=")|(?<=vrUrl =").*?(?=")|(?<=\')//.*?(?=\')'), str(html)) 

newLinks = [] 
for link1 in linkList: 
    if (link1.startswith("//")): 
     newLinks.append(link1) 
    elif (link1.startswith("../")): 
     newLinks.append(link1) 
    elif (link1.startswith("../../")): 
     newLinks.append(link1) 
    elif (link1.startswith("http")): 
     newLinks.append(link1) 
    elif (link1.startswith("/")): 
     newLinks.append(link1) 
    else: 
     newLinks.append(link1) 

На данный момент, что происходит, когда речь идет о втором состоянии, которое является " ../ "он дает мне все URL-адреса, которые начинаются с" ../ ", а также" ../../ ". Это поведение, которое мне не нужно. То же самое касается «/»; он также извлекает URL-адреса, начинающиеся с «//». Я также попытался использовать начальные и конечные параметры функции «startswith», но это не решает проблему.

+0

Как насчет замены порядка 'elif' заявлений, так что'. ./../ 'проверяется * до *' ../ '? – jojonas

+0

Это будет работать, но я не хочу изменять какой-то определенный URL-адрес, как все, начинающиеся с «//», должны оставаться такими же, но когда выполнение достигнет «/», он все равно вычислит другие с двумя слэшами. –

+0

Это грязно, но вы можете использовать пустой оператор 'elif' (используя' pass') в этом случае ... – jojonas

ответ

1

Как об использовании str.count метода:

>>> src="../styles/scripts/jquery-1.9.1.min.js" 
>>> src2='../../images/plus.png' 
>>> src.count('../') 
1 
>>> src2.count('../') 
2 

Это, кажется, чтобы быть правдой, как ../ существует только в начале URLs