web-dev-qa-db-fra.com

Différence entre .string et .text BeautifulSoup

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.

27
piratemurray

.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

  • Propriété pratique d'un tag pour obtenir la chaîne unique dans cette balise.
  • Si le tag a une seule chaîne enfant, la valeur de retour est cette chaîne.
  • Si le tag n'a pas d'enfants ou plusieurs enfants, la valeur de retour est None
  • Si ce tag a une valeur de retour de balise enfant, c'est l'attribut 'string' de la balise enfant, récursivement.

Et text

  • Obtenez toutes les chaînes enfants et retournez-les concaténées en utilisant le séparateur donné.

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
47
salmanwahed

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)

0
user1907906