2017-05-03 3 views
0

Mein Code als Referenz:BeautifulSoup gibt URLs der Seiten auf derselben Website verkürzt

import httplib2 
from bs4 import BeautifulSoup 

h = httplib2.Http('.cache') 
response, content = h.request('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html') 
soup = BeautifulSoup(content, "lxml") 
urls = [] 
for tag in soup.findAll('a', href=True): 
    urls.append(tag['href']) 
responses = [] 
contents = [] 
for url in urls: 
    try: 
     response1, content1 = h.request(url) 
     responses.append(response1) 
     contents.append(content1) 
    except: 
     pass 

Die Idee ist, erhalte ich die Nutzlast einer Webseite, und dann kratzen, dass für Hyperlinks. Einer der Links ist zu yahoo.com, die andere zu ‚http://csb.stanford.edu/class/public/index.html

jedoch das Ergebnis bin ich von BeautifulSoup bekommen ist:

>>> urls 
['http://www.yahoo.com/', '../../index.html'] 

dies ein Problem darstellt, weil der zweite Teil des Skripts kann nicht auf der zweiten, verkürzten URL ausgeführt werden. Gibt es eine Möglichkeit, BeautifulSoup die vollständige URL abrufen zu lassen?

Antwort

1

Das ist, weil der Link auf der Webseite tatsächlich von diesem Formular ist. Der HTML-Code der Seite lautet:

<p>Or let's just link to <a href=../../index.html>another page on this server</a></p>

Dies ist ein relativer Link aufgerufen wird.

Um dies in eine absolute Verbindung umzuwandeln, können Sie urljoin aus der Standardbibliothek verwenden.

from urllib.parse import urljoin # Python3 

urljoin('http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html`, 
     '../../index.html') 
# returns http://csb.stanford.edu/class/public/index.html 
+0

natürlich, danke. Ich kann den URL-Join-Teil in die Ausnahmen aufnehmen. –

+0

auf weiteren Gedanken, ich werde nicht stören, es ist nur spezifisch für eine einzelne Webseite und nicht lohnt sich wirklich zu kümmern –

Verwandte Themen