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. 0
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