J'ai remarqué quelque chose d'étrange quand je travaillais avec BeautifulSoup et je n'ai trouvé aucune documentation pour le supporter, alors je voulais demander ici.
Disons que nous avons des balises comme celles-ci que nous avons analysées avec BS:
<td>Some Table Data</td>
<td></td>
La manière officielle documentée d'extraire les données est soup.string
. Cependant, cela a extrait un NoneType pour le deuxième <td>
tag. J'ai donc essayé soup.text
(car pourquoi pas?) et il a extrait une chaîne vide exactement comme je le voulais.
Cependant, je n'ai pu trouver aucune référence à cela dans la documentation et je crains que quelque chose soit manqué. Quelqu'un peut-il me faire savoir si cette utilisation est acceptable ou causera-t-elle des problèmes plus tard?
BTW Je suis en train de gratter les données de table d'une page Web et je veux créer des CSV à partir des données, donc j'ai vraiment besoin de chaînes vides plutôt que de NoneTypes.
.string
sur un objet de type Tag
renvoie un objet de type NavigableString
. D'autre part, .text
récupère toutes les chaînes enfants et retourne concaténées en utilisant le séparateur donné. Le type de retour de .text est unicode
objet.
De la documentation , A NavigableString
est comme une chaîne Python Unicode
, sauf qu'il prend également en charge certaines des fonctionnalités décrites dans Navigation dans l'arbre et Recherche dans l'arbre .
Depuis documentation on .string
, nous pouvons voir que, si le html est comme ça,
<td>Some Table Data</td>
<td></td>
Ensuite, .string
sur le deuxième td retournera None
. Mais .text
renverra une chaîne vide qui est un objet de type unicode
.
Pour plus de commodité,
string
tag
pour obtenir la chaîne unique dans cette balise.tag
a une seule chaîne enfant, la valeur de retour est cette chaîne.tag
n'a pas d'enfants ou plusieurs enfants, la valeur de retour est None
tag
a une valeur de retour de balise enfant, c'est l'attribut 'string' de la balise enfant, récursivement.Et text
Si le html
est comme ceci:
<td>some text</td>
<td></td>
<td><p>more text</p></td>
<td>even <p>more text</p></td>
.string
sur les quatre td
retournera,
some text
None
more text
None
.text
donnera un résultat comme celui-ci,
some text
more text
even more text
Si une balise contient plus d'une chose, alors ce n'est pas clair à quoi .string doit se référer, donc .string est défini comme étant Aucun:
exemple:
<td>sometext<p>sometext</p></td>
Le code ci-dessus renverra NoneType si: td.string est fait car le td contient des textes ainsi qu'une autre balise p. Mais td.text donnera: quelque chose de textuel
L'élément
<td></td>
ne contient-il pas une chaîne vide. C'est équivalent à
<td/>
qui n'a pas d'enfant. Pour XML, "pas de texte" et "texte de longueur nulle" sont identiques.
Alors soup.string
est correct pour renvoyer NoneType
.
Voir aussi Comment créer un nœud de texte XML avec une valeur de chaîne vide (en Java)