Python Beautifulsoup UnicodeDecodeError - python

I've read lots of messages around here for this problem, but I couldn't solve it for my particular case. I save a html page in Firefox (the page is one of my Youtube playlist). But I get the error from beautifulsoup:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 1000858: character maps to
playlist = BeautifulSoup(html_file, 'lxml', from_encoding="utf-8")
I tried several encoding parameters with no success.
Html file can be downloaded here:
https://www.filehosting.org/file/details/879011/playlist.html
If anyone can help...

Well, after hours spent on browsing everywhere to find a solution, it was really simple actually: just ignoring the errors have produced the right output as you got!
Simply with:
with open('playlist.html', 'r', encoding='utf-8', errors='ignore') as f_in:
soup = BeautifulSoup(f_in.read(), 'html.parser')
Thank you for your help!
PS: I'm just wondering if the errors weren't caused by lots of graphical characters due to special fonts used (little drawings next to the titles)...

I downloaded your file from the filehosting, and from_encoding="utf-8" is not needed - it produces warning if it's there.
from bs4 import BeautifulSoup
with open('playlist.html', 'r') as f_in:
soup = BeautifulSoup(f_in.read(), 'html.parser')
for title in soup.select('#video-title'):
print(title.get_text(strip=True))
Prints:
Gordon Ramsay Cooks Carbonara in Under 10 Minutes | Ramsay in 10
Sans four, frais et doux en quelques minutes # 303
Comment faire des tomates séchées au soleil - Les Sourciers
Italian homemade sun dried tomatoes
Recette du clafoutis moelleux aux cerises - 750g
Recette des Carrés Framboise Pistache
Une QUICHE ensoleillée et végétarienne pour un repas facile à faire !
Millionaires Shortbread Recipe - Layers of WIN! | Cupcake Jemma
Rum Raisin Ice Cream Recipe Demonstration - Joyofbaking.com
🍋 ENTREMETS CITRON PRALINÉ 🍋
Recette de Tarte aux Fruits
Anna Bakes DECADENT Chocolate Whoopie Pies!
Ultimate Lemon Meringue Layer Cake | Cupcake Jemma
Blueberry Pie Recipe Demonstration - Joyofbaking.com
The Macaron is dead! Long live the Macaroon! | Cupcake Jemma
Anna Makes AMAZING Raspberry Jelly Donuts!
Des SANDWICHS originaux et surtout à dévorer avec les doigts !
Astuce de boulanger  comment préparer une baguette tradition maison Gontran cherrier
Recette des Tartelettes Citron Chocolat Blanc Estragon de Frédéric Bau
Cream Cheese Cookies
🌰 GANACHE AU PRALINÉ 🌰
Anna Bakes INCREDIBLE Fudge Brownies LIVE!
Triple Chocolate Brownies Recipe Demonstration - Joyofbaking.com
Make your own Piping Bag! Quick & Easy DIY Piping Bag Tip | Cupcake Jemma
Professional Baker's Best Checkerboard Cookie Recipe!
Anna Bakes an AMAZING Mango Mousse Tart!
Un LAYER CAKE AUX FRAISES expliqués pas à pas pour une parfaite réussite !
🔥 CHOUQUETTES FACILE ET INRATABLES 🔥
Recette des Petites Tropéziennes Fraise Vanille
Anna Bakes CLASSIC Florentine Cookies!
Classic Carrot Cake Recipe | Cupcake Jemma
Anna Teaches You How To Make PIE DOUGH LIVE | Oh Yum 101
🌰 TARTE PRALINOISE (CHOCOLAT PRALINÉ) FACILE 🌰
🐿 SALAMBO MAISON (ou GLAND) 🐿
Tuto Recette : La Tarte Alsacienne aux Cerises ! 🍒
Recette de Brookies
Anna Bakes OUTSTANDING Pfeffernusse Cookies!
Une recette accessible aux enfants avec seulement 1 courgette, 2 tomates et 3 œufs| Savoureux.tv
Biscuits Recipe Demonstration - Joyofbaking.com
🍓 TARTE AUX FRAISES TRADITIONNELLE et FACILE 🍓
Anna Bakes AMAZING Crispy Lavash Bread!
Tuto Recette Facile : la Focaccia
👱‍♀ CHEESECAKE PISTACHE FRAMBOISE SPÉCIAL FÊTE DES MÈRES 👱‍♀
Recette de Cake Salé aux Pruneaux, Lardons et Fromage
Anna Bakes OUTSTANDING Blood Orange Syrup Cake!
Professional Baker's Best Rhubarb Crumble Tart Recipe!
Double Rainbow Cupcakes! | Bake with Sally | Cupcake Jemma
🌞 LES MONTECAOS ! 2 RECETTES FACILES ET RAPIDES 🌞
Petit déjeuner pour les paresseux - je mets tout dans une casserole et sur la cuisinière
Raspberry White Chocolate New York Cookie Bake Along! | with Jemma, Sally & Dane
Recette de Choux Pralinés façon Paris-Brest
🍓 GÂTEAU ROULÉ AUX FRAISES 🍓
Tuto Recette Facile : le Cake Chocolat et Gianduja
Réalisez ces délicieux carrés au chocolat, crémeux et moelleux. Ils sont SUPER!| Savoureux.tv
Recette des Rochers Noix de Coco Framboise Chocolat Blanc
🥖 PAIN MAGIQUE SANS PÉTRISSAGE, FACILE ET RAPIDE (et ultra bon) ! 🥖
Recette Spéciale CAP : la Charlotte Poire Chocolat !
🌰 BISCUITS SABLÉS AU NUTELLA 🌰
Tuto Recette : le Banoffee, c'est facile !
Recette des Pains ou Buns Farcis au Poulet, Légumes et Épices
Butter Fingers - Les Petits Croissants aux Amandes et aux Pignons de Pin
RECETTE PETITS CROISSANTS AMANDE PIGNONS FLEUR D'ORANGER
Le Succès Praliné : la recette facile expliquée de A à Z !
Recette des Sablés au Sarrasin, Graines et Perles au Chocolat de Frédéric Bau
Professional Baker's Best Pretzel Recipe!
Recette du Gâteau Napolitain maison
Recette du Paris-Brest
Recette de gâteau au chocolat simple et délicieuse. Mélangez le tout et goûtez le!| Savoureux.tv
Recette du Milkshake à la fraise - 750g
Très simple et fait en seulement 2 minutes.| Savoureux.tv
Recette de la Tarte Tropézienne
💕 PASTEIS DE NATA (FLANS PORTUGAIS) à LISBONNE ! 💕
Recette de Cupcakes à la Vanille Cœur Praliné
Super Easy, Ridiculously Tasty Lamingtons Recipe! | Bake at Home | Cupcake Jemma
Recette de Verrines Fraise Citron
Biscuits salés faits maison - ils sont parfaits pour le panier-repas !| Savoureux.tv
🍓 CHARLOTTE AUX FRAISES FACILE (tuerie !) 🍓
Coffee cake ou Gâteau pour le café - 750g
Crème Caramel
Ceci est une nouvelle recette. Un gâteau d'exception!| Savoureux.tv
BEIGNETS au FOUR sans friture : + légers et moelleux 😜
Cake aux pommes facile et rapide - 750g
Recette de Gâteau aux pommes et au yaourt - 750g
Italian Grandma Makes Gnocchi
Tuto Recette : les Pizzas Faciles !
🥐 RECETTE DES CROISSANTS MAISON 🥐
Muffins au fromage - ils sont si savoureux et moelleux qu’ils fondent dans la bouche! | Savoureux.TV
Professional Baker's Best Double Chocolate Trifle Recipe!
Professional Baker's Best Chocolate Torte Recipe!
How to Make Perfect Caramel Popcorn | Cupcake Jemma
Double Choc Chip NYC Cookies | Super Gooey Chocolate New York Cookie Recipe | Cupcake Jemma
Red Velvet New York Cookie Recipe! | Cupcake Jemma
Recette des Petites Baguettes de Pain Maison
Recette du sunday et ses 4 accompagnements GOURMANDS - 750g
🐯 TIGRÉS AU NUTELLA, RECETTE FACILE ET RAPIDE 🐯
BAKE AT HOME | Jamaican Ginger Loaf Cake | Cupcake Jemma
4 recettes étonnantes et gourmandes avec des fraises - 750g
⚓ FAR BRETON NATURE - FACILE ET RAPIDE ⚓
Recette Spéciale CAP : la Pâte Feuilletée, le Millefeuille et les Chaussons a
Homemade Mac & Cheese with Cauliflower | Keep Cooking & Carry On | Jamie Oliver #withme

Related

Append list of lists to dataframe display list errors

Good afternoon,
I am looking for a way to append a list of lists into a dataframe as column but I am not getting the result I expected. I have a directory with 12 files and for each file , I want to put it in a dataframe with the correct header but so far what I am doing, put all the lists, I get to the same column and I cannot change that.
The files are txt files and have mutliple rows. the small one has 200 lines and the long one has approx. 2020 lines.
path=r"C:\Use\Emmanu\Documents\tal\class\corpus"
files = os.listdir(path)
list_all = []
for file in files:
if file.endswith(".txt"):
if os.path.isfile(os.path.join(path,file)):
f=open(os.path.join(path,file),'r', encoding= 'utf-8')
#next(f)
f = [line.rstrip() for line in f]
list_all.append(f)
print(len(list_all))
print(len(list_all[7]))
df = pd.DataFrame()
df = pd.DataFrame(list_all).T.set_index(0).T
print(df.head(5))
df.columns = ['FR_IX', 'FR_IX_A', 'FR_IX_B', 'FR_OR', 'FR_A', 'FR_B',
'MOT_IX' 'MOT_IX_A', 'MOT_IX_B', 'MOT_OR', 'MOT_A', 'MOT_B']
Result is like this and I cannot put each list in a column with the respective header.
12
431
0 ce qui me dérange, c’est le tout connecté, avec les ondes \
1 Ce qui me dérange, c'est que tout est lié, ave...
2 Ce qui me dérange, c'est que tout est lié, ave...
3 Hélas, l'impression de violence, bien que très...
4 Hélas, l'impression de violence, bien que très...
5 Hélas, l'impression de violence, bien que très...
0 Toujours en partant du fait que… donc, qu’il y a cette intelligence et puis on va pouvoir éliminer une partie de ce qui est régul. Maintenant, si ce n’est pas le cas… euh… je n’arriverais pas… Chez nous, je ne vois pas l’intérêt du produit. \
1 Toujours à partir du fait que... donc, qu'il y...
2 Toujours à partir du fait que... donc, qu'il y...
3 Tout ça ne me donne pas envie d'utiliser un pi...
4 Tout cela ne me donne pas envie d'utiliser un ...
5 Tout cela ne me donne pas envie d'utiliser un ...

How to count the number of line in a tsv file which end with a specific string?

I have a tsv file with two columns seperate by tabulation. The first column is the colum of sentences and the second the column of label I want to count the number of sentences which are positive, negative or neutral in the file sa I read it and loop inside it. I come up with this small code but It does not work ? How can I improve it ?
tsv = ['jdmfreins', 'jdmconditions', 'jdmne', 'jdmmotivations']
for s in tsv:
c_pos = 0
c_neu = 0
c_neg = 0
path = os.path.join(fileDir, '/mnt/c/Users/Emmanuelle/Documents/Extraction_corpus/fichier_sorti_tsv', s + '.tsv')
with open(path, 'r', encoding='utf-8') as l_1:
next(l_1)
print(s, '\n ')
l_1 = [line.rstrip() for line in l_1]
for line in l_1:
print(line)
if line.strip().endswith('positif'):
c_pos =+ 1
elif line.strip().endswith('neutre'):
c_neu =+ 1
else:
c_neg =+ 1
print('nombre positif :', c_pos)
print('nombre négatif :', c_neg)
print('nombre neutre :', c_neu, '\n')
The file look like this :
"""""""J'avais adoré les deux premières, mais celui-ci n'est pas du tout à la hauteur.""" positif
Peter Criss et Ace Frehley trouvent davantage leur place dans le travail de composition et au chant (Hooligan / Shock Me) face à l'omniprésence de la paire Stanley/Simmons mais les tensions internes existent et conduiront aux 4 albums solos de 1978... positif
Le contexte est certes bien rendu, mais les rapports entre les héros sont exécrables. positif
Le sujet aurait pu faire un bon vaudeville avec un tant soit peu d'humour et de finesse, mais, la plus belle femme du monde ne peut donner que ce qu'elle a !!! positif
arnold est mauvais, il fait des blagues pas marrantes le mechant est simplement le meme que dans le 2 mais en plus balezes, nick stahl est mauvais : pour finir c'est pitoyable de voir ce que peut faire hollywood pour du fric! neutre
Oui mais... Excusez moi mais même si les sketch me font rire séparément, essayer de tous les avaler en une soirée, c'est comme essayer de manger des kilos de foie gras en un repas. neutre
Au risque de ne pas brosser la majorité dans le sens du poil, je vais donner un avis honnête, qui n'engage que moi mais qui est tellement différent de ceux que j'avais pu lire qu'il peut être utile à certains. positif
(oubliez les compils recentes qui n'ont de compils que le nom,mais n'ont pas oublié au passage le coté biseness négatif
Début long avant d'etre pris par un peu de suspens devant un personnage que l'on pense interessant ( psychothérapeute tueur !)mais elle nous amène vers d'autres personnages s'étendant sur leur séjour, leur rencontre que l'on s'imagine utile pour la fin mais il n'en est rien!! neutre
La charge est un peu cruelle, mais l’unicité du style des DA de Miyasaki finit par me lasser. positif
Bon et bien le premier n'était déjas pas une révélation du cinéma mais là on frise le délit d'abut de confience. positif
Peut être suis-je excessif dans mes propos, mais je crois qu'ils sont à la mesure de ma déception. positif
"""presque cristalline chante pour 2 minutes de Bonheur auditif après tant de déception: Pourquoi ne se lancerait elle pas plutôt dans l'opéra et le répertoire classique revisité???ses nouvelles fréquentations lui font probablement du bien au cœur mais feraient mieux de changer de métier et arrêter de pervertir son talent si mal exploité""""""" neutre
and the answer :
nombre positif : 0
nombre négatif : 0
nombre neutre : 1
I tried also : if line.split('\t') == 'positif': but same answer
You can use Counter from the collections module:
from collections import Counter
with open('file.txt','r') as f:
lines = f.read().splitlines()
count = Counter([l.split()[-1] for l in lines])
print(count)
Output:
Counter({'positif': 8, 'neutre': 4, 'négatif': 1})
If you want the results in a dictionary:
print(dict(count))
Output:
{'positif': 8, 'neutre': 4, 'négatif': 1}
Breaking it down. This part:
with open('file.txt','r') as f:
lines = f.read().splitlines()
will assign all the lines in file.txt to a list called lines. The newlines have already been taken care of by the read().splitlines(). This part:
[l.split()[-1] for l in lines]
is a list comprehension that will list all the last words from the lines in lines, where str.split() will return a list of strings that have been separated by a space, and [-1] means the last element of the list.

Frequency of words in a text (pandas)

I have a column of words and would like to count the frequency of each word in a text and save that result in another column.
Data:
word frequency
0 l’iss
1 station
2 américaines
3 capsule
4 dernier
5 solaires
6 fusées
7 privé
Text:
états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur.
I tried:
from collections import Counter
freq = df['word'].str.apply(Counter(text))
My output:
AttributeError: 'StringMethods' object has no attribute 'apply'
Good output:
word frequency
0 cape 1
1 station 2
2 américaines 0
3 capsule 0
4 dernier 1
5 solaires 0
6 fusée 2
You can transform the text into a counter and then fetch the results from it, using a mix of value_counts and to_dict.
# Assuming the text split is on \s
text_counts = pd.Series(text.split(' ')).value_counts().to_dict()
df['Frequency'] = df.word.apply(lambda x: text_counts.get(x, 0)) # In case the word doesn't exist
word Frequency
0 l’iss 0
1 station 2
2 américaines 0
3 capsule 0
4 dernier 0
5 solaires 0
6 fusées 0
7 privé 0
Another approach is using Python's native Counter:
from collections import Counter
text_counter = Counter(text.split())
df['Frequency'] = df.word.apply(lambda x: text_counter.get(x, 0))
It would be easier the other way around. Start with the Counter object and from that build the dataframe
from collections import Counter
text = '''états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur.'''
# naive splitting, it might be better to use regex with \b
c = Counter(text.split())
df = pd.DataFrame(list(c.items()), columns=['word', 'count'])
print(df.head())
Outputs
word count
0 états-unis 2
1 : 3
2 lancement 4
3 réussi 2
4 pour 5
You can then filter the dataframe for the words you want (or you can do the filtering while building the dataframe).
Replace your commas with space, then .split() and then use a dictionary comprehension and map that to your df.
import pandas as pd
text = "états-unis : lancement réussi pour station space x dragon états-unis : lancement réussi pour space x dragon la fusée falcon 9, développée par une société privée : spacex, a décollé de la station sans problème ce matin à 7h44 utc. 22 mai 2012. - prévu initialement pour samedi dernier, le lancement a été reporté à la dernière seconde, suite à la défaillance d'une valve dans un des neuf moteurs du pre\xadmier étage du lan\xadceur. le lanceur a décollé du site de lancement du pas de tir 40 (slc-40) de la base de cape canaveral en floride, qui était autrefois utilisé pour les fusée titan iii et iv et qui a été reconverti pour ce lanceur."
df = pd.DataFrame({'word': ["l’iss", 'station', "américaines", "capsule", "dernier", "solaires", "fusée", "privé"]})
text_list = text.replace(',', ' ').split()
word_counts = {i: text_list.count(i) for i in text_list}
df['frequency'] = df['word'].map(word_counts).fillna(0)
You could summarise the word counts in a dict then use map:
text_list = text.split()
word_counts = {word: text_list.count(word) for word in text_list}
df['frequency'] = df['word'].map(word_counts).fillna(0)

XPath with Scrapy node begins with \n

I'm using scrapy on html like:
<td nowrap="" valign="top" align="right">
<br>
Text is here.
<br>
Other text is here
<br>
</td>
td[1]/text()[1] gives me:
(empty line)
Text is here.
I've tried normalize-space, i.e. normalize-space(td[1]/text()[1]), which works when I test in my firefox extension, but not in scrapy. I think scrapy is getting tripped up by the \n and it skips over (or only takes first line of node, which is nothing). I've also tried some "preceding" and "following" code, but I think it might be considered one element, my DOM says the nodeValue = "\nText is here" Any thoughts?,
Extract every text, get the desired one by index. For instance:
response.xpath("//table[#id='myid']/tr[1]/td[1]//text()")[1]
Demo from the Scrapy Shell:
$ scrapy shell http://www.trobar.org/troubadours/coms_de_peiteu/guilhen_de_peiteu_01.php
In [1]: table = response.xpath("//table")[2]
In [2]: td = "".join(table.xpath(".//td[1]//text()").extract())
In [3]: print(td)
Companho, farai un vers qu'er covinen,
Et aura-i mais de foudatz no-y a de sen,
Et er totz mesclatz d'amor e de joy e de joven.
E tenguatz lo per vilan qui no-l enten,
O dins son cor voluntiers non l'apren:
Greu partir si fai d'amor qui la troba a talen.
Dos cavalhs ai a ma sselha, ben e gen,
Bon son et adreg per armas e valen,
E no-ls puesc amdos tener, que l'us l'autre non cossen.
Si-ls pogues adomesjar a mon talen,
Ja no volgr'alhors mudar mon garnimen,
Que meils for'encavalguatz de nuill ome viven.
Launs fon dels montaniers lo plus corren,
Mas aitan fer' estranhez'a longuamen
Et es tan fers e salvatges, que del bailar si defen.
L'autre fon noyritz sa jus part Cofolen
Ez anc no-n vis bellazor, mon escien:
Aquest non er ja camjatz ni per aur ni per argen.
Qu'ie-l donei a son senhor polin payssen,
Pero si-m retinc ieu tan de covenen
Que, s'ilh lo tenia un an, qu'ieu lo tengues mais de cen.
Cavalier, datz mi cosselh d'un pessamen:
-Anc mays no fuy issaratz de cauzimen- :
Res non sai ab qual me tengua, de n'Agnes o de n'Arsen.
De Gimel ai lo castel e-l mandamen,
E per Niol fauc ergueill a tota gen:
C'ambedui me son jurat e plevit per sagramen.

python ascii to unicode conversion

i have a file with data like this:
\r\n\tSoci\u00e9t\u00e9 implant\u00e9 dans l'internet recrute des t\u00e9l\u00e9conseillers en b to b pour effectuer de la prise de rendez-vous qualifi\u00e9 pour de la conception de site internet et du r\u00e9f\u00e9rencement google.
how can i print it as unicode, like this:
Société implanté dans l'internet recrute des téléconseillers en b to b pour effectuer de la prise de rendez-vous qualifié pour de la conception de site internet et du référencement google.
i know i have to use some unicode function but what?
That looks like a python unicode string literal; decode this from unicode_escape.
Demo:
>>> data = "\r\n\tSoci\u00e9t\u00e9 implant\u00e9 dans l'internet recrute des t\u00e9l\u00e9conseillers en b to b pour effectuer de la prise de rendez-vous qualifi\u00e9 pour de la conception de site internet et du r\u00e9f\u00e9rencement google."
>>> data.decode('unicode_escape')
u"\r\n\tSoci\xe9t\xe9 implant\xe9 dans l'internet recrute des t\xe9l\xe9conseillers en b to b pour effectuer de la prise de rendez-vous qualifi\xe9 pour de la conception de site internet et du r\xe9f\xe9rencement google."
>>> print data.decode('unicode_escape')
Société implanté dans l'internet recrute des téléconseillers en b to b pour effectuer de la prise de rendez-vous qualifié pour de la conception de site internet et du référencement google.
You can either decode the data as you read it from the file (using a binary mode), or you can use io.open() in Python 2, or regular open() in Python 3 to have data decoded on the fly:
from io import open
with open(filename, 'r', encoding="unicode_escape") as inputfile:
for line in inputfile:
print(inputfile)
Note that JSON strings use the same escape syntax; \uhhhh denotes a Unicode codepoint using just ASCII characters.

Categories

Resources