Krijg alle URL's op een paginapython

Ik werk aan iets waarvoor ik alle URL's op een pagina moet ophalen. Het lijkt te werken op de meeste websites die ik heb getest, bijvoorbeeld microsoft.com, maar het geeft slechts drie terug van google.com. Hier is de relevante broncode:


   import urllib
   import time
   import re
   fwcURL = "http://www.microsoft.com" #URL to read
   mylines = urllib.urlopen(fwcURL).readlines()
   print "Found URLs:"
   time.sleep(1) #Pause execution for a bit
   for item in mylines:
     if "http://" in item.lower(): #For http
       print item[item.index("http://"):].split("'")[0].split('"')[0] # Remove ' and " from the end, for example in href=
     if "https://" in item.lower(): #For https
       print item[item.index("https://"):].split("'")[0].split('"')[0] # Ditto

Als mijn code kan worden verbeterd of als er een betere manier is om dit te doen, reageer dan. Bij voorbaat dank!

1
Heb je BeautifulSoup geprobeerd?
toegevoegd de auteur Todd A. Jacobs, de bron
Alle URL's op een pagina ophalen is in feite een spin ...
toegevoegd de auteur gabeio, de bron

3 antwoord

Probeer Mechanize of BeautifulSoup of lxml te gebruiken.

Door BeautifulSoup te gebruiken, kunt u eenvoudig alle html/xml-inhoud krijgen.

import urllib2
from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("some_url")
soup = BeautifulSoup(page.read())
links = soup.findAll("a")
for link in links:
    print link["href"]

BeautifulSoup is very easy to learn and understand.

3
toegevoegd

Ten eerste is HTML geen reguliere taal en geen enkele eenvoudige manipulatie van de reeks zoals die zal op alle pagina's werken. U hebt een echte HTML-parser nodig. Ik zou Lxml aanbevelen. Dan is het gewoon een kwestie van terugkomen door de boom en het vinden van de elementen die je wilt.

Ten tweede kunnen sommige pagina's dynamisch zijn, dus u zult niet alle inhoud in de html-bron vinden. Google maakt intensief gebruik van JavaScript en AJAX (zie hoe het resultaten weergeeft zonder de pagina opnieuw te laden).

2
toegevoegd
+1 voor commentaar over sites die veel gebruik maken van JS/Ajax.
toegevoegd de auteur Felix, de bron

Ik zou lxml gebruiken en doen:

import lxml.html

page = lxml.html.parse('http://www.microsoft.com').getroot()
anchors = page.findall('a')

Het is vermeldenswaard dat als links dynamisch worden gegenereerd (via JS of iets soortgelijks), je deze niet zult krijgen als je een browser op de een of andere manier wilt automatiseren.

2
toegevoegd