2016-08-16 3 views
0

Ich mache ein Projekt auf Web-Crawling, für die ich alle Links innerhalb einer bestimmten Webseite finden muss. Bis jetzt benutzte ich urljoin in urllib.parse. Aber jetzt habe ich festgestellt, dass einige Links nicht ordnungsgemäß mit der urljoin-Funktion verbunden sind.Vollständige URL aus href extrahieren mit Python

Für z.B. Das <a>-Tag könnte etwas wie <a href="a.xml?value=basketball">A</a> sein. Die vollständige Adresse könnte jedoch http://www.example.org/main/test/a.xml?value=basketball sein, aber die urljoin-Funktion wird falsche Ergebnisse geben (etwa).

-Code, die ich verwende:

parentUrl = urlQueue.get() 

html = get_page_source(parentUrl) 

bSoup = BeautifulSoup(html, 'html.parser') 
aTags = bSoup.find_all('a', href=True) 

for aTag in aTags: 
    childUrl = aTag.get('href') 

    # just to check if the url is complete or not(for .com only) 
    if '.com' not in childUrl: 
     # this urljoin is giving invalid resultsas mentioned above 
     childUrl = urljoin(parentUrl, childUrl) 

Gibt es eine Möglichkeit, durch die ich richtig zwei URLs beitreten können, diese Fälle einschließlich?

+0

Sie erhalten eher Hilfe, wenn Sie nur minimalen Arbeitscode zum Erstellen bereitstellen. – handle

+0

Sagen Sie mir, wenn Sie etwas anderes brauchen ... Mein Hauptanliegen ist es jedoch, eine absolute Link-Adresse mit dem Attribut href zu erstellen, das manchmal nicht den vollständigen Pfad enthält. –

+0

Löschen Sie den HINWEIS. Es ist eine Browserfunktion. –

Antwort

0

Nur ein paar Verbesserungen, um das zu erreichen. In Ihrem Fall übergeben Sie den Basis-URI mit einem Schrägstrich. Alles, was Sie brauchen, um dies zu erreichen, ist in den BTW docs of urlparse

>>> import urlparse 
>>> urlparse.urljoin('http://www.example.org/main/test','a.xml?value=basketball') 
'http://www.example.org/main/a.xml?value=basketball' 
>>> urlparse.urljoin('http://www.example.org/main/test/','a.xml?value=basketball') 
'http://www.example.org/main/test/a.xml?value=basketball' 

geschrieben: Dies ist ein perfekter Anwendungsfall, um den Code ausklammern für URLs in eine separate Funktion zu bauen. Schreiben Sie dann einige Komponententests, um zu überprüfen, ob sie wie erwartet funktionieren und sogar mit Ihren Edge-Fällen arbeiten. Danach benutze es in deinem Web-Crawler-Code.

+0

Dieser Code funktioniert für Python 2.7, kann aber auf Python 3.5 angewendet werden, wenn Sie urllib.parse als OP verwenden. –

+0

Danke, mein Herr. In manchen Fällen scheint es zu funktionieren. Lass es mich vollständig testen, bevor du diese Antwort akzeptierst. –

Verwandte Themen