2016-06-01 2 views
1

Schreiben Sie eine Funktion, die eine Webseite öffnet und ein Wörterbuch aller Links und deren Text auf dieser Seite zurückgibt. Ein Link wird durch einen HTML-Tag definiert, der wieFunktion, die eine Webseite öffnet und ein Wörterbuch aller Links und deren Text zurückgibt

< ahref = "http://my.computer.com/some/file.html"> Linktext </a>

Der Link sieht alles ist in Anführungszeichen nach thehref =, und der Text ist alles zwischen dem> und dem. Für das obige Beispiel würde der Eintrag in einem Wörterbuch wie folgt aussehen:

"{" http: // my.computer.com/some/file.html ":" link text ", ...}"

Hier ist mein Code soweit, dass ich für ein paar Stunden festgefahren bin. Wie erreiche ich dieses Problem?

import urllib.request 


def Urls(webpage): 
    url = webpage 
    page = urllib.request.urlopen(url) 
    url_list = {} 
    for line in page: 
     if '<a href=' in line: 

Antwort

0
def Urls(webpage): 
    url = webpage 
    page = urllib.request.urlopen(url) 
    url_list = {} 
    for line in page: 
     if '<a href=' in line: 
      try: 
       url = line.split('<a href="')[-1].split('">')[0] 
       txt = line.split('<a href="')[-1].split('">')[-1].split('< /a>')[0] 
       url_list[url] = txt 
      except: 
       pass 
    return url_list 
0
r=re.compile("<\s*a\s*href=\"(.*?)\">(.*?)<\s*/a\s*>") 
list = r.findall(line) 
for tuple in list: 
    url_list[tuple[0]] = tuple[1] 
+0

Bitte keine regulären Ausdrücke empfehlen HTML zu analysieren. Es gibt stabile Bibliotheken für diese Aufgabe. –

2

Während die Antworten dieses Problem mit regulären Ausdrücken zu bekämpfen was darauf hindeutet, könnte Arbeit, werden sie scheitern (es sei denn, Sie Maßnahmen ergreifen), wenn z.B. Die Verbindung ist auf mehrere Zeilen aufgeteilt. Z.B. das ist vollkommen gültig HTML:

<a 
href="../path">link</a> 

Es gibt einige andere Grenzfälle zu berücksichtigen. Im Allgemeinen kann HTML nicht mit regulären Ausdrücken geparst werden und es gibt einige excellent prose darüber geschrieben. Übrigens ist die Konstruktion "a href" in line eine weniger starke Form des regulären Ausdrucks, die nur in einer Zeile sucht und die gleichen Nachteile hat.

Stattdessen sollten Sie in Bibliotheken suchen, die HTML als korrekt formatiertes XML-Dokument analysieren. In Python wäre die Go-to-Bibliothek beautifulsoup. Damit können Sie schnell alle Links auf einer Webseite erhalten, z. wie folgt aus:

import urllib 
from bs4 import BeautifulSoup 
url = "http://www.imdb.com/" 
page = urllib.request.urlopen(url) 
soup = BeautifulSoup(page, 'html.parser') 
soup.find_all('a') # returns all links as a list 
links = [a['href'] for a in soup.find_all('a', href=True)] # some anchors might have no href attribute, by specifying href=True, you'll get only those that do 

Die beautifulsoup documentation ist sehr gut dokumentiert, mit Tonnen von Beispielen. Es ist eine Lektüre wert.

0

Mit requests und SoupStrainer der Einfachheit/Effizienz:

import requests 
from bs4 import BeautifulSoup, SoupStrainer 

def get_urls(webpage): 
    res = requests.get(webpage) 
    links = [l for l in BeautifulSoup(res.text, parseOnlyThese=SoupStrainer('a'))    
      if l.has_attr('href')] 
    return links 
Verwandte Themen