2017-09-14 1 views
2

je donne les résultats suivants qui fonctionne très bien quand il n'y a pas d'enfant le tag h4:re.compile ne fonctionne pas pour l'élément de texte BeautifulSoup4 quand il y a des enfants

if (BS.find('div', {"id" : "table_content"}).find('h4', text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 

cependant, lorsque l'étiquette h4 a des enfants, les l'impression n'arrive jamais. J'ai essayé le débogage en utilisant les éléments suivants:

for h4 in BS.find('div', {"id" : "table_content"}).findAll('h4'): 
    print h4.text 

qui produit:

Users  
Super Users 
    (TMP) 
      

Administrators 
.... 

En fait, la partie (TMP) semble jeter hors parce qu'il est le texte d'un enfant de la balise h4, comme par exemple :

<h4>Super User 
    <span>(<a href="/tmp">TMP</a>)</span> 
</h4> 

l'inconvénient est que le (TMP) est pas toujours là, donc je ne peux pas faire des hypothèses. J'ai juste besoin de savoir si Super User est dans le texte de h4, alors je peux continuer.

+0

pas sûr, mais ça ne serait pas 're.compile (". * Super Users. *", Flags = re.DOTALL) 'pour gérer les sauts de ligne? –

+0

Malheureusement, cela ne semble pas fonctionner. C'est peut-être parce que j'ai testé 'if h4.text [: 5] ==" Super "' et ça passe. Peut-être que mon regex est éteint? – rjbogz

+0

ok, essayez 're.compile (". * Super \ s + Users. * "))', Tous les espaces ne sont pas des espaces. –

Répondre

2

Ne pas définir le type d'étiquette (h4) dans find paramètres ou définir séparément en tant que méthode de BS:

if (BS.find('div', {"id" : "table_content"}).find(text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 

ou

if (BS.find('div', {"id" : "table_content"}).h4.find(text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 
+0

Wow, une telle solution simple. Pourquoi cela fait-il une différence? – rjbogz

+0

Je ne suis pas sûr, mais je pense que c'est une caractéristique de l'analyseur actuel. Lorsque vous ne définissez pas de balise, elle recherche tous les éléments html qui ont cet attribut ('texte'). Il est probable que lorsque la balise h4 a des frères et sœurs, l'analyseur décide que ce texte leur appartient, mais pas le parent h4 lui-même. Donc, quand vous appelez 'find' sans balises, vous le faites aussi rechercher dans les textes frères et sœurs. –