Je suis actuellement en train de mettre en place un pipeline de traitement des données où les réponses au sondage sont importées d'une base de données. Une partie du contenu importé est en HTML, que je dois supprimer de manière cohérente et convertir en texte brut, mais le contenu n'est pas cohérent à 100%. Plus précisément, les caractères spéciaux sont parfois non échappés et parfois je les reçois sous forme de codes HTML d'échappement.

J'ai utilisé avec succès beautifulsoup pour y parvenir, mais maintenant j'ai rencontré un cas de bord où une esperluette non échappée est mystérieusement retirée du code.

Par exemple, ce code:

BeautifulSoup('R&D', features="html.parser").get_text()

Résulte en:

'RD'

Ce que j'attends:

'R&D'
0
DataWiz 8 nov. 2019 à 12:15

2 réponses

Meilleure réponse

Utilisez lxml au lieu de html.parser

soup=BeautifulSoup('R&D', features="lxml").get_text()
print(soup)
1
KunduK 8 nov. 2019 à 11:10

Avec html.parser - In HTML, the ampersand character (“&”) declares the beginning of an entity reference (a special character). If you want one to appear in text on a web page you should use the encoded named entity “&”

Ainsi, quand il l'analysera sans balises / en tant qu'entité, il verra cela comme une référence d'entité:

html = 'R&D'
soup = BeautifulSoup(html, features="html.parser")

print (soup)

Donne donc la sortie RD

Cependant, si tel est le contenu / texte dans la balise, il reconnaîtra le & comme symbole codé:

html = '<span>R&D</span>'
soup = BeautifulSoup(html, features="html.parser")

print (soup)

La sortie est <span>R&amp;D</span>, donc quand vous faites soup.text, elle affichera correctement R&D

1
chitown88 8 nov. 2019 à 11:16