J'ai un petit script en python3.7 (voir la question associée here ) qui supprime les liens d'un site Web ( http://digesto.asamblea.gob.ni/consultas/coleccion/ ) et les enregistre dans une liste. Malheureusement, ils ne sont que partiels et je dois les couper pour les utiliser comme liens.
Voici la partie pertinente du script:
["http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D", "http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=Z%2FgLeZxynkg%3D", "http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=9rka%2BmYwvYM%3D"]
Comment puis-je manipuler le liste (à titre d'exemple seulement avec trois entrées ici) à quoi ressemble ce
["http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D');return false;", "http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=Z%2FgLeZxynkg%3D');return false;", "http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=9rka%2BmYwvYM%3D');return false;"]
list_of_links = [] # will hold the scraped links
tld = 'http://digesto.asamblea.gob.ni'
current_url = driver.current_url # for any links not starting with /
table_id = driver.find_element(By.ID, 'tableDocCollection')
rows = table_id.find_elements_by_css_selector("tbody tr") # get all table rows
for row in rows:
row.find_element_by_css_selector('button').click()
link = row.find_element_by_css_selector('li a[onclick*=pdf]').get_attribute("onclick") # href
print(list_of_links)# trim
if link.startswith('/'):
list_of_links.append(tld + link)
else:
list_of_links.append(current_url + link)
row.find_element_by_css_selector('button').click()
print(list_of_links)
Décomposition l'exemple du premier lien, j'obtiens ce lien du site Web essentiellement comme
http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/ util / pdf.php? type = rdd & rdd = p2% 2FHzlqau8A% 3D '); return false;
et devez le couper en
http: //digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D.
Comment puis-je réaliser cela en python à partir de la liste entière ?
4 Réponses :
Cela devrait faire l'affaire:
s = "http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D');return false;"
s = s.replace("/consultas/coleccion/window.open('", "").replace("');return false;", "")
Une approche consiste à fractionner sur la chaîne /consultas/coleccion/window.open (', supprimer l'extrémité indésirable de la deuxième chaîne et concaténer les deux chaînes traitées pour obtenir votre résultat.
Cela devrait le faire:
new_links = []
for link in list_of_links:
current_strings = link.split("/consultas/coleccion/window.open('")
current_strings[1] = current_strings[1].split("');return")[0]
new_link = current_strings[0] + current_strings[1]
new_links.append(new_link)
Vous pouvez utiliser une expression régulière pour diviser les URL de votre liste et laisser urllib.parse.urljoin () faire le reste pour vous:
http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D
Renvoie:
import re
from urllib.parse import urljoin
PATTERN = r"^([\S]+)window.open\('([\S]+)'"
links = ["http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D');return false;"]
result = "http://digesto.asamblea.gob.ni/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D"
for link in links:
m = re.match(PATTERN, link, re.MULTILINE).groups()
# m is now: ('http://digesto.asamblea.gob.ni/consultas/coleccion/', '/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D')
if len(m) == 2:
newLink = urljoin(*m)
print(newLink)
assert newLink == result
Pour cela vous pouvez utiliser des expressions régulières:
Considérez ce code:
import re
out = list()
lst = ["http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=p2%2FHzlqau8A%3D');return false;", "http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=Z%2FgLeZxynkg%3D');return false;", "http://digesto.asamblea.gob.ni/consultas/coleccion/window.open('/consultas/util/pdf.php?type=rdd&rdd=9rka%2BmYwvYM%3D');return false;"]
for el in lst:
temp = re.sub(r"(.*?)/window.open\('(.*?)'\).*", r"\1\2", el)
out.append(temp)
print(temp)
La fonction sub permet de remplacer une partie des chaînes correspondant le modèle spécifié. En gros, c'est révélateur:
(. *?) : conserve tous les caractères avant /window.open... /window.open \ ( la chaîne d'entrée doit avoir le modèle /window.open ( mais elle ne sera pas conservée (. *?) conserver tous les caractères après le modèle précédent jusqu'à ce qu'un ) soit trouvé (représenté par \ () li >
.replace ("/ consultas / coleccion / window.open ('", "")vous permettra de démarrerQuelles hypothèses pouvez-vous faire? Par exemple, tous vos liens se terminent-ils en 3D? Tous ont-ils par exemple
window.open?