a limpar os textos dos url ' s de ligações em python

Então tenho um belo código de sopa que visita a página principal de um site e raspa as ligações ali. No entanto, quando eu recebo os links em python eu não posso parecer limpar o link (depois que ele é convertido para uma string) para a concatenação com o url de raiz.

import re
import requests
import bs4

list1=[]

def get_links():

    regex3= re.compile('/[a-z\-]+/[a-z\-]+')
    response = requests.get('http://noisetrade.com')
    soup = bs4.BeautifulSoup(response.text)
    links=  soup.select('div.grid_info  a[href]')
    for link in links:
       lk= link.get('href')
       prtLk= regex3.findall(lk)
       list1.append(prtLk)


def visit_pages():
    url1=str(list1[1])
    print(url)

get_links()
visit_pages()

produz resultados:"['/stevevantinemusic / material não solicitado'] "

resultado desejado:"/stevevantinemusic / material não solicitado "

Eu tentei .strip () and .substituir () e re.sub/match / etc. . . Não posso. parece isolar os caracteres ' [,\',] ' que são os caracteres que eu preciso remover, eu tinha iterado através dele com sub-cadeias, mas que se sente ineficiente. Tenho a certeza que me está a escapar algo óbvio.

Author: Patrick Williams, 2015-03-07

3 answers

findall devolve uma lista de resultados para que possa escrever:

for link in links:
    lk = link.get('href')    
    urls = regex3.findall(lk)   
    if urls:
        prtLk = urls[0]
        list1.append(prtLk)

Ou melhor, utilizar search Método:

for link in links:
    lk = link.get('href')    
    m = regex3.search(lk)
    if m:
        prtLk = m.group()
        list1.append(prtLk)

Esses parêntesis foram o resultado da conversão de uma lista com um elemento para uma cadeia de caracteres. Por exemplo:

l = ['text']
str(l)

Resultados em:

"['text']"
 1
Author: Lorean, 2015-03-07 20:54:18

Aqui eu uso a expressão regular r'[\[\'\]]' para substituir qualquer um dos caracteres indesejados pelo texto vazio:

$ cat pw.py
import re

def visit_pages():
    url1="['/stevevantinemusic/unsolicited-material']"
    url1 = re.sub(r'[\[\'\]]','',url1)
    print(url1)

visit_pages()

$ python pw.py
/stevevantinemusic/unsolicited-material
 0
Author: jas, 2015-03-07 20:35:32
Eis um exemplo do que penso que está a tentar fazer:
>>> import bs4
>>> with open('noise.html', 'r') as f:
...     lines = f.read()
... 
>>> soup = bs4.BeautifulSoup(lines)
>>> root_url = 'http://noisetrade.com'
>>> for link in soup.select('div.grid_info a[href]'):
...     print(root_url + link.get('href'))
... 
http://noisetrade.com/stevevantinemusic
http://noisetrade.com/stevevantinemusic/unsolicited-material
http://noisetrade.com/jessicarotter
http://noisetrade.com/jessicarotter/winter-sun
http://noisetrade.com/geographermusic
http://noisetrade.com/geographermusic/live-from-the-el-rey-theatre
http://noisetrade.com/kaleo
http://noisetrade.com/kaleo/all-the-pretty-girls-ep
http://noisetrade.com/aviddancer
http://noisetrade.com/aviddancer/an-introduction
http://noisetrade.com/thinkr
http://noisetrade.com/thinkr/quiet-kids-ep
http://noisetrade.com/timcaffeemusic
http://noisetrade.com/timcaffeemusic/from-conversations
http://noisetrade.com/pearl
http://noisetrade.com/pearl/hello
http://noisetrade.com/staceyrandolmusic
http://noisetrade.com/staceyrandolmusic/fables-noisetrade-sampler
http://noisetrade.com/sleepyholler
http://noisetrade.com/sleepyholler/sleepy-holler
http://noisetrade.com/sarahmcgowanmusic
http://noisetrade.com/sarahmcgowanmusic/indian-summer
http://noisetrade.com/briandunne
http://noisetrade.com/briandunne/songs-from-the-hive

Lembre - se também que o bs4 tem os seus próprios tipos que usa.

Uma boa maneira de depurar os scripts seria colocar:

for link in links:
   import pdb;pdb.set_trace() # the script will stop for debugging here
   lk= link.get('href')
   prtLk= regex3.findall(lk)
   list1.append(prtLk)

Onde quiseres depurar.

E depois podias fazer algo assim dentro de ti.pdb:
next
l
print(type(lk))
print(links)
dir()
dir(links)
dir(lk)
 0
Author: jmunsch, 2015-03-07 20:54:30