J'utilise urllib pour obtenir une chaîne de code HTML d'un site Web et je dois mettre chaque mot du document HTML dans une liste.
Voici le code que j'ai jusqu'à présent. Je continue d'avoir une erreur. J'ai également copié l'erreur ci-dessous.
import urllib.request
url = input("Please enter a URL: ")
z=urllib.request.urlopen(url)
z=str(z.read())
removeSpecialChars = str.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
words = removeSpecialChars.split()
print ("Words list: ", words[0:20])
Voici l'erreur.
Please enter a URL: http://simleyfootball.com
Traceback (most recent call last):
File "C:\Users\jeremy.KLUG\My Documents\LiClipse Workspace\Python Project 2\Module2.py", line 7, in <module>
removeSpecialChars = str.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
TypeError: replace() takes at least 2 arguments (1 given)
str.replace n'est pas la bonne fonction pour ce que vous voulez faire (mis à part qu'elle n'est pas utilisée correctement). Vous voulez remplacer n'importe quel caractère d'un ensemble par un espace, et non l'ensemble d'un seul espace (ce dernier est ce que remplace fait). Vous pouvez utiliser traduire comme ceci:
removeSpecialChars = z.translate ({ord(c): " " for c in "!@#$%^&*()[]{};:,./<>?\|`~-=_+"})
Cela crée un mappage qui mappe chaque caractère de votre liste de caractères spéciaux vers un espace, puis appelle translate () sur la chaîne, en remplaçant chaque caractère du jeu de caractères spéciaux par un espace.
Une solution consiste à utiliser re.sub , c'est ma méthode préférée.
import re
my_str = "hey th~!ere"
my_new_string = re.sub('[^a-zA-Z0-9 \n\.]', '', my_str)
print my_new_string
Sortie:
hey there
Une autre méthode consiste à utiliser re.escape :
import string
import re
my_str = "hey th~!ere"
chars = re.escape(string.punctuation)
print re.sub(r'['+chars+']', '',my_str)
Sortie:
hey there
Juste un petit conseil sur le style des paramètres en python par PEP-8 les paramètres devraient être remove_special_chars
et non removeSpecialChars
Aussi, si vous voulez garder les espaces, changez simplement [^a-zA-Z0-9 \n\.]
en [^a-zA-Z0-9\n\.]
Vous devez appeler replace
sur z
et non pas sur str
, car vous souhaitez remplacer les caractères situés dans la variable chaîne z
.
removeSpecialChars = z.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
Mais cela ne fonctionnera pas, étant donné que les propriétés de remplacement d'une sous-chaîne sont remplacées, vous devrez probablement utiliser le module d'expression régulière re
avec la fonction sub
:
import re
removeSpecialChars = re.sub("[!@#$%^&*()[]{};:,./<>?\|`~-=_+]", " ", z)
N'oubliez pas le []
, qui indique qu'il s'agit d'un ensemble de caractères à remplacer.
replace opère sur une chaîne spécifique, vous devez donc l'appeler ainsi.
removeSpecialChars = z.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
mais ce n'est probablement pas ce dont vous avez besoin, car cela recherchera une seule chaîne contenant tous ces caractères dans le même ordre. vous pouvez le faire avec une expression rationnelle, comme l'a souligné Danny Michaud.
en guise de remarque, vous voudrez peut-être rechercher BeautifulSoup , qui est une bibliothèque permettant d'analyser du texte désordonné au format HTML, comme ce que vous obtenez habituellement en scapant des sites Web.
Vous pouvez remplacer les caractères spéciaux par les caractères souhaités comme suit,
import string
specialCharacterText = "H#y #@w @re &*)?"
inCharSet = "!@#$%^&*()[]{};:,./<>?\|`~-=_+\""
outCharSet = " " #corresponding characters in inCharSet to be replaced
splCharReplaceList = string.maketrans(inCharSet, outCharSet)
splCharFreeString = specialCharacterText.translate(splCharReplaceList)