3
votes

Couper les liens dans la liste avec python3.7

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 ?


2 commentaires

.replace ("/ consultas / coleccion / window.open ('", "") vous permettra de démarrer


Quelles hypothèses pouvez-vous faire? Par exemple, tous vos liens se terminent-ils en 3D? Tous ont-ils par exemple window.open ?


4 Réponses :


1
votes

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;", "")


0 commentaires

1
votes

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)


0 commentaires

1
votes

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


0 commentaires

1
votes

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 >


0 commentaires