web-dev-qa-db-fra.com

Comment extraire les URL d'une page HTML en Python

Je dois écrire un robot d'indexation Web en Python. Je ne sais pas comment analyser une page et extraire les URL du HTML. Où dois-je aller étudier pour écrire un tel programme?

En d'autres termes, existe-t-il un simple programme python qui peut être utilisé comme modèle pour un robot d'indexation générique? Idéalement, il devrait utiliser des modules relativement simples à utiliser et devrait inclure de nombreux commentaires pour décrire ce que fait chaque ligne de code.

14
user2189704

Regardez l'exemple de code ci-dessous. Le script extrait le code html d'une page Web (ici Python) et extrait tous les liens de cette page. J'espère que cela vous aidera.

#!/usr/bin/env python

import requests
from bs4 import BeautifulSoup

url = "http://www.python.org"
response = requests.get(url)
# parse html
page = str(BeautifulSoup(response.content))


def getURL(page):
    """

    :param page: html of web page (here: Python home page) 
    :return: urls in that page 
    """
    start_link = page.find("a href")
    if start_link == -1:
        return None, 0
    start_quote = page.find('"', start_link)
    end_quote = page.find('"', start_quote + 1)
    url = page[start_quote + 1: end_quote]
    return url, end_quote

while True:
    url, n = getURL(page)
    page = page[n:]
    if url:
        print(url)
    else:
        break

Sortie:

/
#left-hand-navigation
#content-body
/search
/about/
/news/
/doc/
/download/
/getit/
/community/
/psf/
http://docs.python.org/devguide/
/about/help/
http://pypi.python.org/pypi
/download/releases/2.7.3/
http://docs.python.org/2/
/ftp/python/2.7.3/python-2.7.3.msi
/ftp/python/2.7.3/Python-2.7.3.tar.bz2
/download/releases/3.3.0/
http://docs.python.org/3/
/ftp/python/3.3.0/python-3.3.0.msi
/ftp/python/3.3.0/Python-3.3.0.tar.bz2
/community/jobs/
/community/merchandise/
/psf/donations/
http://wiki.python.org/moin/Languages
http://wiki.python.org/moin/Languages
http://www.google.com/calendar/ical/b6v58qvojllt0i6ql654r1vh00%40group.calendar.google.com/public/basic.ics
http://www.google.com/calendar/ical/j7gov1cmnqr9tvg14k621j7t5c%40group.calendar.google.com/public/basic.ics
http://pycon.org/#calendar
http://www.google.com/calendar/ical/3haig2m9msslkpf2tn1h56nn9g%40group.calendar.google.com/public/basic.ics
http://pycon.org/#calendar
http://www.psfmember.org

...

18
Shankar

Vous pouvez utiliser BeautifulSoup comme beaucoup l'ont également indiqué. Il peut analyser HTML, XML, etc. Pour voir certaines de ses fonctionnalités, voir ici .

Exemple:

import urllib2
from bs4 import BeautifulSoup
url = 'http://www.google.co.in/'

conn = urllib2.urlopen(url)
html = conn.read()

soup = BeautifulSoup(html)
links = soup.find_all('a')

for tag in links:
    link = tag.get('href',None)
    if link is not None:
        print link
14
pradyunsg
import sys
import re
import urllib2
import urlparse
tocrawl = set(["http://www.facebook.com/"])
crawled = set([])
keywordregex = re.compile('<meta\sname=["\']keywords["\']\scontent=["\'](.*?)["\']\s/>')
linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?>')

while 1:
    try:
        crawling = tocrawl.pop()
        print crawling
    except KeyError:
        raise StopIteration
    url = urlparse.urlparse(crawling)
    try:
        response = urllib2.urlopen(crawling)
    except:
        continue
    msg = response.read()
    startPos = msg.find('<title>')
    if startPos != -1:
        endPos = msg.find('</title>', startPos+7)
        if endPos != -1:
            title = msg[startPos+7:endPos]
            print title
    keywordlist = keywordregex.findall(msg)
    if len(keywordlist) > 0:
        keywordlist = keywordlist[0]
        keywordlist = keywordlist.split(", ")
        print keywordlist
    links = linkregex.findall(msg)
    crawled.add(crawling)
    for link in (links.pop(0) for _ in xrange(len(links))):
        if link.startswith('/'):
            link = 'http://' + url[1] + link
        Elif link.startswith('#'):
            link = 'http://' + url[1] + url[2] + link
        Elif not link.startswith('http'):
            link = 'http://' + url[1] + '/' + link
        if link not in crawled:
            tocrawl.add(link)

Référencé à: Python Web Crawler en moins de 50 lignes (lent ou ne fonctionne plus, ne se charge pas pour moi)

5
Scy

Vous pouvez utiliser beautifulsoup . Suivez la documentation et voyez ce qui correspond à vos besoins. La documentation contient également des extraits de code pour savoir comment extraire des URL.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)

soup.find_all('a') # Finds all hrefs from the html doc.
3
Sushant Gupta

Avec l'analyse des pages, consultez le module BeautifulSoup . Il est simple à utiliser et vous permet d'analyser des pages en HTML. Vous pouvez extraire des URL du HTML simplement en faisant str.find('a')

N'utilisez pas d'expressions régulières pour analyser HTML

2
TerryA