Web scraping sous Python (1/10) | Rudiments

Premier pas de web scraping

Urlopen

Approche basique en utilisant la classe urlopen du module request

from urllib.request import urlopen
html = urlopen('http://pythonscraping.com/pages/page1.html')
print(html.read())
<html>
  \n<head>
    \n
    <title>A Useful Page</title>
    \n</head
  >\n
  <body>
    \n
    <h1>An Interesting Title</h1>
    \n
    <div>
      \nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
      veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
      commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
      velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
      cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
      est laborum.\n
    </div>
    \n
  </body>
  \n
</html>
\n

BeautifulSoup

Par rapport à urlopen, on n’a pas besoin d’appeler read pour accéder au contenu de page web.

Il est à noter que la deuxième option lors de la création d’un objet BeautifulSoup précise le parseur qui est 'html.parser' dans notre cas.

A sa place, le parseur lxml montre plus d’avantage que html.parser dans le sens où il fonctionne mieux face aux HTML codes mal formés tels que des balises non fermées, mal imbriquées ou oublées. De plus, il est plus rapide que l’autre même si la vitesse n’est pas forcément un avantage dans web scraping car le plus important goulet serait souvent la vitesse du réseau elle-même.

from bs4 import BeautifulSoup

html = urlopen('http://www.pythonscraping.com/pages/page1.html')
bs = BeautifulSoup(html.read(), 'html.parser')
print(bs.h1)
<h1>An Interesting Title</h1>

Même output avec différentes expressions

html = urlopen('http://www.pythonscraping.com/pages/page1.html')
bs = BeautifulSoup(html, 'html.parser')
  • Expression 1

    print(bs.h1)
    
  • Expression 2

    print(bs.html.h1)
    
  • Expression 3

    print(bs.html.body.h1)
    
  • Expression 4

    print(bs.body.h1)
    

Gérer l’erreur d’adresse de page Web

L’erreur HTTP peut être “404 Page Not Found”, “500 Internal Server Error”, etc.

from urllib.error import HTTPError
from urllib.error import URLError

try:
    html = urlopen("http://www.pythonscraping.com/pages/page1.html22")
except HTTPError as e:  # this is actually a more layman understanding of URLError. HTTPError is a predefined name so that you can't replace it with other names
    print(e)
except URLError as e:
    print("The server could not be found!")
    # the server error means there is no such website as This HTTP error may be “404 Page Not Found,” “500 Internal Server Error,” and so forth
else:
    print(html.read())
HTTP Error 404: Not Found

Ecrire une fonction pour l’erreur url

def getTitle(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        return None
    try:
        bsObj = BeautifulSoup(html.read(), "lxml")
        title = bsObj.body.h1
    except AttributeError as e:
        return None
    return title

# check if an element is none

title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
    print("Title could not be found")
else:
    print(title)
<h1>An Interesting Title</h1>
Avatar
Xing-yu LIU 星语 刘

My research interests include speech science, computation linguistics and more generally, natural language processing

comments powered by Disqus