2013-08-08 3 views
1
<p align="JUSTIFY"><a href="#abcd"> Mr A </a></p> 
<p align="JUSTIFY">I </p> 
<p align="JUSTIFY"> have a question </p> 
<p align="JUSTIFY">&nbsp;</p> 
<p align="JUSTIFY"><a href="#mnop"> Mr B </a></p> 
<p align="JUSTIFY">The </p> 
<p align="JUSTIFY">answer is</p> 
<p align="JUSTIFY">not there</p> 
<p align="JUSTIFY">&nbsp;</p> 
<p align="JUSTIFY"><a href="wxyz"> Mr C </a></p> 
<p align="JUSTIFY">Please</p> 
<p align="JUSTIFY">Help</p> 

Je veux itérer l'extraction des données à l'aide de &nbsp;.comment extraire toutes les données entre  

  • La première itération doit afficher J'ai une question
  • deuxième itération devrait afficher La réponse est pas là
  • Les noms de personnes doivent également être extraits dans une autre liste ..pour exemple [ M. A ', « M. B », « Mr C »]

Si quelqu'un a une idée de le faire, il pourrait être utile parce que je suis en train d'apprendre python est resté coincé avec ce code problème.Le j'ai essayé est

for t in soup.findAll('p',text = re.compile('&nbsp;'), attrs = {'align' : 'JUSTIFY'}): 
    print t 
    for item in t.parent.next_siblings: 
     if isinstance(item, Tag): 
      if 'p' in item.attrs and 'align' in item.attrs['p']: 
       break 
      print item 

Il retourne [] qui est pas ce que veulent

+3

Bienvenue dans Stack Overflow! On dirait que vous voulez que nous écrivions du code pour vous. Tandis que de nombreux utilisateurs sont prêts à produire du code pour un codeur en détresse, ils aident généralement seulement lorsque l'affiche a déjà essayé de résoudre le problème par eux-mêmes. Une bonne façon de démontrer cet effort est d'inclure le code que vous avez écrit jusqu'à présent, exemple d'entrée (s'il y en a), la sortie attendue, et la sortie que vous obtenez réellement (sortie de la console, traces de pile, erreurs du compilateur en vigueur). Plus vous fournissez de détails, plus vous aurez de chances de recevoir des réponses. –

+0

Je ne considérerais pas l'analyse de HTML comme un choix particulièrement judicieux pour «apprendre Python» - quels concepts connaissez-vous déjà, quelles approches avez-vous déjà essayées, quelles idées avez-vous développées jusqu'à présent? –

+0

@MartijnPieters Merci pour vos conseils. Le code que j'ai essayé est d'abord trouver tout '& nbsp' mais il retourne [] print soup.findAll ('p', text = re.compile (' '), attrs = {'align': 'JUSTIFIER'}) – user2657822

Répondre

0

Juste une autre méthode utilisant l'expression rationnelle:

from re import sub 

html = '<p align="JUSTIFY">I </p>\ 
<p align="JUSTIFY"> have a question </p>\ 
<p align="JUSTIFY">&nbsp;</p>\ 
<p align="JUSTIFY">The </p>\ 
<p align="JUSTIFY">answer is</p>\ 
<p align="JUSTIFY">not there</p>\ 
<p align="JUSTIFY">&nbsp;</p>\ 
<p align="JUSTIFY">Please</p>\ 
<p align="JUSTIFY">Help</p>' 

print [sub("\s+", " ", x).strip() for x in sub("<.*?>", " ", html).split("&nbsp;")] 

sortie:

['I have a question', 'The answer is not there', 'Please Help'] 
+0

@ iCodez-Merci beaucoup pour la réponse, il se sépare quand il trouve ' ' et je peux boucler les résultats comme je le veux. Merci beaucoup – user2657822

+0

@ iCodez-Mais au début de chaque élément de la liste, il affiche J'essaie d'obtenir RIF de celui-ci, mais merci beaucoup – user2657822

+0

@ user2657822 - C'est très étrange et je crains que je ne peux pas vraiment vous aider avec ça. Vos données doivent être différentes de celles données. Cependant, vous pouvez toujours essayer quelque chose comme '[x.replace (" & # 9 "," ") pour x dans l]' où 'l' est la liste. – iCodez

3

Vous pouvez le faire avec BeautifulSoup:

from bs4 import BeautifulSoup 

s = "" 

html = '<p align="JUSTIFY">I </p>\ 
<p align="JUSTIFY"> have a question </p>\ 
<p align="JUSTIFY">&nbsp;</p>\ 
<p align="JUSTIFY">The </p>\ 
<p align="JUSTIFY">answer is</p>\ 
<p align="JUSTIFY">not there</p>\ 
<p align="JUSTIFY">&nbsp;</p>\ 
<p align="JUSTIFY">Please</p>\ 
<p align="JUSTIFY">Help</p>' 

soup = BeautifulSoup(html) 
title = soup.findAll("p", {"align" : "JUSTIFY"}) 

for i in title: 
    s += ''.join(i.contents) 

f = s.split("&nbsp;") 
for i in f: 
    print i 
+0

@ ton1c-Merci pour l'idée. Je l'ai essayé, mais j'ai reçu l'erreur TypeError: séquence item 1: chaîne attendue ou Unicode, Tag trouvé à l.append (''. Join (i.contents)) – user2657822

+0

@ ton1c-J'ai essayé avec le code édité. En fait, dans mon code réel, il y a des sous-étiquettes dans le tag p, pensez-vous que cela pourrait être le problème? – user2657822

Questions connexes