Comment puis-je récupérer le titre d'une page Web (balise html du titre) en utilisant Python?Comment puis-je récupérer le titre d'une page Web en utilisant Python?
Répondre
Je vais toujours utiliser lxml pour de telles tâches. Vous pouvez également utiliser .
import lxml.html
t = lxml.html.parse(url)
print t.find(".//title").text
Ceci est probablement trop pour une telle tâche simple, mais si vous envisagez de faire plus que cela, il est plus raisonnable de partir de ces outils (mécaniser, BeautifulSoup) parce qu'ils sont beaucoup plus faciles à utiliser que les solutions de rechange (urllib pour obtenir du contenu et regexen ou un autre analyseur pour analyser html)
Liens: BeautifulSoup mechanize
#!/usr/bin/env python
#coding:utf-8
from BeautifulSoup import BeautifulSoup
from mechanize import Browser
#This retrieves the webpage content
br = Browser()
res = br.open("https://www.google.com/")
data = res.get_data()
#This parses the content
soup = BeautifulSoup(data)
title = soup.find('title')
#This outputs the content :)
print title.renderContents()
L'objet du navigateur de mécaniser a un titre() méthode. Ainsi, le code de this post peut être réécrite comme:
from mechanize import Browser
br = Browser()
br.open("http://www.google.com/")
print br.title()
Voici une version simplifiée de @Vinko Vrsalovic's answer:
import urllib2
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen("https://www.google.com"))
print soup.title.string
REMARQUE:
soup.title trouve le premier titre élément n'importe où dans le document html
title.string suppose qu'il n'a que un nœud enfant, et ce nœud enfant est une chaîne
Pour beautifulsoup 4.x, utilisez différents import:
from bs4 import BeautifulSoup
Merci! Au cas où quelqu'un rencontrerait des problèmes similaires, dans mon environnement Python3, j'ai dû utiliser 'urlllib.request' au lieu de' urllib2'. Pas certain de pourquoi. Pour éviter l'avertissement BeautifulSoup à propos de mon analyseur, j'ai dû faire 'soup = BeautifulSoup (urllib.request.urlopen (url)," lxml ")'. – sudo
soup.title.string
renvoie effectivement une chaîne unicode. Pour convertir en chaîne normale, vous devez faire string=string.encode('ascii','ignore')
Cela supprimera tout caractère non-ascii qui n'est probablement pas ce que vous voulez. Si vous voulez vraiment des octets (ce que 'encoder' donne) et pas une chaîne, encoder avec le bon' charset'. par exemple, 'string.encode ('utf-8')'. – reubano
En utilisant HTMLParser:
from urllib.request import urlopen
from html.parser import HTMLParser
class TitleParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.match = False
self.title = ''
def handle_starttag(self, tag, attributes):
self.match = True if tag == 'title' else False
def handle_data(self, data):
if self.match:
self.title = data
self.match = False
url = "http://example.com/"
html_string = str(urlopen(url).read())
parser = TitleParser()
parser.feed(html_string)
print(parser.title) # prints: Example Domain
Il serait intéressant de noter que ce script est pour Python 3. le module HtmlParser a été renommé en html.parser dans Python 3.x. De même urllib.request a été ajouté en Python 3. – satishgoda
Il est probablement préférable de convertir explicitement les octets en une chaîne, 'r = urlopen (url)', 'encoding = r.info(). Get_content_charset()', et 'html_string = r.read(). decode (encodage) '. – reubano
Pas besoin d'importer d'autres bibliothèques. La requête a cette fonctionnalité intégrée.
>> hearders = {'headers':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0'}
>>> n = requests.get('http://www.imdb.com/title/tt0108778/', headers=hearders)
>>> al = n.text
>>> al[al.find('<title>') + 7 : al.find('</title>')]
u'Friends (TV Series 1994\u20132004) - IMDb'
utilisant des expressions régulières
import re
match = re.search('<title>(.*?)</title>', raw_html)
title = match.group(1) if match else 'No title'
Qu'est-ce que .group (1)? Toute référence? – pije
Salut, 'group (0)' retournerait le match entier. Voir [match-objects] (https://docs.python.org/3.6/library/re.html#match-objects) pour référence. – Finn
Cela manquera tous les cas où les étiquettes de titre ne sont pas formées exactement comme
Voici une implémentation à tolérance de panne HTMLParser
.
Vous pouvez jeter à peu près n'importe quoi à get_title()
sans rupture, Si quelque chose d'inattendu se produit get_title()
renverra None
.
Lorsque Parser()
télécharge la page, il le code à ASCII
quel que soit le jeu de caractères utilisé dans la page en ignorant les erreurs. Il serait trivial de changer to_ascii()
pour convertir les données en UTF-8
ou tout autre encodage. Ajoutez simplement un argument de codage et renommez la fonction en quelque chose comme to_encoding()
.
Par défaut, HTMLParser()
va casser sur le html cassé, il va même casser sur des choses triviales comme les balises incompatibles. Pour éviter ce comportement, j'ai remplacé la méthode d'erreur HTMLParser()
par une fonction qui ignore les erreurs.
#-*-coding:utf8;-*-
#qpy:3
#qpy:console
'''
Extract the title from a web page using
the standard lib.
'''
from html.parser import HTMLParser
from urllib.request import urlopen
import urllib
def error_callback(*_, **__):
pass
def is_string(data):
return isinstance(data, str)
def is_bytes(data):
return isinstance(data, bytes)
def to_ascii(data):
if is_string(data):
data = data.encode('ascii', errors='ignore')
elif is_bytes(data):
data = data.decode('ascii', errors='ignore')
else:
data = str(data).encode('ascii', errors='ignore')
return data
class Parser(HTMLParser):
def __init__(self, url):
self.title = None
self.rec = False
HTMLParser.__init__(self)
try:
self.feed(to_ascii(urlopen(url).read()))
except urllib.error.HTTPError:
return
except urllib.error.URLError:
return
except ValueError:
return
self.rec = False
self.error = error_callback
def handle_starttag(self, tag, attrs):
if tag == 'title':
self.rec = True
def handle_data(self, data):
if self.rec:
self.title = data
def handle_endtag(self, tag):
if tag == 'title':
self.rec = False
def get_title(url):
return Parser(url).title
print(get_title('http://www.google.com'))
- 1. titre de la page Web
- 2. Récupérer cookie créé en utilisant javascript en python
- 3. Code Python pour télécharger une page Web en utilisant JavaScript
- 4. obtenir un titre iframe page de javascript en utilisant jquery
- 5. Rails: Comment changer le titre d'une page?
- 6. Comment lire le titre d'une page externe?
- 7. Quel est le moyen le plus simple de récupérer une page Web en C?
- 8. Page perdant le titre après UpdatePanel asyncpostback
- 9. Calculer la taille de la page Web en python
- 10. Comment récupérer une page Web html redirigée par programme?
- 11. Comment obtenir le titre de la page HTML avec JavaScript?
- 12. comment appeler le formulaire Web dans vb.net en utilisant (asp.net)
- 13. Récupérer tous les cookies en Python
- 14. Comment utiliser Python pour vous connecter à une page Web et récupérer des cookies pour un usage ultérieur?
- 15. Comment trouver le modèle mobile en utilisant la page WAP
- 16. Lancer une page Web sur un onglet Firefox (victoire) en utilisant Python
- 17. Comment obtenir des liens sur une page Web en utilisant mécaniser et ouvrir ces liens
- 18. ouvrir une page Web dans IE en utilisant C#
- 19. Obtenir le titre pour correspondre lien Titre
- 20. Comment obtenir le titre de la fenêtre active en cours en utilisant C#?
- 21. Problème avec localisant titre HTML d'une page
- 22. Comment récupérer du texte sélectionné en utilisant Regex en C#?
- 23. oauth google en utilisant python
- 24. Comment puis-je récupérer chaque page de texte dans un document Word séparément (en utilisant .NET)?
- 25. En utilisant Jboss Portal, Comment puis-je récupérer les propriétés de la page dans un jsp?
- 26. Comment afficher les caractères arabes dans une page Web en utilisant le serveur php et sql
- 27. Comment pouvons-nous arrêter la page web après la connexion en utilisant le navigateur précédent
- 28. Titre (dans la directive ASP.NET @ Page) ne rend pas dans la page Web
- 29. Récupérer des valeurs renvoyées à partir d'une procédure stockée MySQL en Python, en utilisant MySQLdb
- 30. Possibilité de redirection en utilisant uniquement une page Web?
Juste au cas où vous IOError avec le code ci-dessus: http: //stackoverflow.com/questions/3116269/error-with-parse-function-in-lxml – Yosh
[lxml peut avoir des problèmes avec Unicode] (http://stackoverflow.com/q/15302125/4279), vous pourriez [utiliser bs4.UnicodeDammit pour l'aider à trouver l'encodage de caractères correct] (http://stackoverflow.com/a/15305248/4279) – jfs