conta il numero di immagini su una pagina web, usando urllib

Per una lezione, ho un esercizio in cui ho bisogno di contare il numero di immagini su qualsiasi pagina web di dare. So che ogni immagine inizia con, quindi sto usando un regexp per cercare di individuarli. Ma continuo a ottenere un conteggio di uno che so è sbagliato, cosa c’è di sbagliato nel mio codice:

import urllib import urllib.request import re img_pat = re.compile('',re.I) def get_img_cnt(url): try: w = urllib.request.urlopen(url) except IOError: sys.stderr.write("Couldn't connect to %s " % url) sys.exit(1) contents = str(w.read()) img_num = len(img_pat.findall(contents)) return (img_num) print (get_img_cnt('http://www.americascup.com/en/schedules/races')) 

Ahhh espressioni regolari.

Il tuo modello regex Dice “Trovami qualcosa che inizi con e cose e assicurati che finisca con > .

Le espressioni regolari sono avide, però; riempirà tutto ciò .* con letteralmente tutto ciò che è ansible lasciando un singolo > personaggio da qualche parte in seguito per soddisfare il modello. In questo caso, andrebbe fino in fondo, e dire "guarda! Ho trovato un > proprio lì!"

Dovresti trovare il giusto conteggio facendo .* non-goloso, come questo:

Non usare mai espressioni regolari per analizzare l’HTML, utilizzare un parser html, come lxml o BeautifulSoup . Ecco un esempio pratico, come ottenere il conteggio dei tag img utilizzando BeautifulSoup e le richieste :

 from bs4 import BeautifulSoup import requests def get_img_cnt(url): response = requests.get(url) soup = BeautifulSoup(response.content) return len(soup.find_all('img')) print(get_img_cnt('http://www.americascup.com/en/schedules/races')) 

Ecco un esempio funzionante usando lxml e requests :

 from lxml import etree import requests def get_img_cnt(url): response = requests.get(url) parser = etree.HTMLParser() root = etree.fromstring(response.content, parser=parser) return int(root.xpath('count(//img)')) print(get_img_cnt('http://www.americascup.com/en/schedules/races')) 

Entrambi i snippet stampano 106 .

Vedi anche:

  • Python Regex – Analisi HTML
  • Espressione regolare in Python per l’analisi HTML (BeautifulSoup)

Spero possa aiutare.

La tua espressione regolare è avida, quindi corrisponde molto più di quanto tu voglia. Suggerisco di usare un parser HTML.

img_pat = re.compile('',re.I) farà il trucco se devi farlo in modo regex. Il ? lo rende non-goloso.