2014-09-04 6 views
-2

Je souhaite analyser des milliers de fichiers HTML. J'utilise le paquet BeautifulSoup.Plusieurs documents dans un seul fichier HTML

Le problème avec mes documents HTML est qu'ils contiennent des graphiques au format de codage ASCII. Le paquet BeautifulSoup n'est pas capable de supprimer ces caractères.

La bonne chose est qu'il existe une façon d'identifier le segment dans ces documents HTML où Graphics a été stocké. Mais je suis nouveau sur Python et je n'arrive pas à comprendre comment supprimer un tel segment avant d'analyser le document en utilisant BeautifulSoup.

Tous les documents HTML contiennent plusieurs documents comme indiqué ici:

<DOCUMENT> 
<TYPE>EX-1 
<SEQUENCE>1 
<FILENAME> 
<DESCRIPTION> 
<TEXT> 
<html> 
. 
. 
</html> 
</TEXT> 
</DOCUMENT> 


<DOCUMENT> 
<TYPE>EX-2 
. 
</DOCUMENT> 

<DOCUMENT> 
<TYPE>EX-3 
. 
</DOCUMENT> 

<DOCUMENT> 
<TYPE>GRAPHIC 
. 
</DOCUMENT> 

Comme indiqué ci-dessus, ce fichier HTML contiennent 4 documents et dernier document dont le type est "graphique" contiennent des graphiques. Je veux supprimer tous ces documents du fichier HTML dont le TYPE est "GRAPHIC". Après la suppression de tous ces graphiques de ce fichier HTML, je prévois d'utiliser le paquet BeautifulSoup pour extraire le texte.

Veuillez m'aider à supprimer ces documents dont le TYPE est GRAPHIQUE.

Voici mon code. Ce code est capable de lire le fichier HTML et d'écrire toute la partie du texte dans un autre fichier. Le problème est que ce code écrit également du contenu graphique.

import os 
import time 
import traceback 
import glob 
from bs4 import BeautifulSoup 
import html5lib 

path = "E:\\" 

def extract(): 
    for file in glob.glob(os.path.join(path, '*.html')): 
     try: 
      file_name = str(file).split(".txt")[0].replace("E:\\","") 
      outfile = open(file_name.replace(".html","")+".txt",'w') 
      htmlfile = open(file,"r") 
      rfile = "".join(htmlfile.readlines()) 
      htmlfile.close() 

      rsoup = BeautifulSoup(rfile,'html5lib') 

      documents = rsoup.find_all('document') 

      #REMOVE HMTL TAGS AND EXTRACT TEXTUAL CONTENT OF HTML FILE 
      a = '\n'.join([e.encode("utf-8").replace("\n","").replace("\r","").replace("\s","").replace("\t","").strip() for e in rsoup.recursiveChildGenerator() if isinstance(e,unicode) and e.strip()!=""]) 
      outfile.write(str(a)) 
      outfile.close() 
      #print a 

      #SUSPEND EXECUTION FOR 5 SECONDS 
      time.sleep(5) 

     except: 
      print "Status: Parsing Failed" 

extract() 

Merci

+0

montrez ce que vous avez fait –

+0

Pourquoi voulez-vous supprimer ces sections _avant_ d'utiliser BeautifulSoup? Analysez simplement le fichier avec BeautifulSoup, puis utilisez-le pour supprimer les sections que vous souhaitez supprimer. – abarnert

+0

@abarnert ... J'ai posté mon code ici. Je ne sais pas comment puis-je supprimer un document particulier en fonction de son type. S'il vous plaît aidez-moi quelle commande/fonction que je devrais utiliser. Merci – Ankit

Répondre

0

Utilisez

documents= [doc for doc in documents if doc.find('type').string!='GRAPHIC'] 

pour supprimer tous les documents de type graphique. Notez que ce code va planter s'il y a un document sans tag TYPE> <.

+0

Il n'y a pas de document sans étiquette . Ce n'est pas une préoccupation. Cependant, la déclaration ci-dessus ne semble pas donner la sortie requise. Je ne suis pas sûr de ce que pourrait être la raison. Est-ce dû au fait qu'il y a une étiquette de fin, c'est-à-dire? – Ankit

+0

Vous dites qu'il filtre les documents de manière incorrecte? (La balise est requise pour que mon code fonctionne.) –

+0

Il n'y a pas de balise dans mes fichiers HTML. Par conséquent, l'instruction ci-dessus filtre incorrectement. – Ankit

Questions connexes