2016-07-03 20 views
2

Mein Skript packt HTML-Code aus einem E-Mail-Posteingang über imaplib, übergibt es durch BeautifulSoup und versucht, alle href s dort zu extrahieren.Zeilenumbrüche Verhindern, dass BeautifulSoup Daten extrahiert

rv, data = M.SEARCH(None, '(FROM "[email protected]")') 
if rv == 'OK': 
    for num in data[0].split(): 
     typ, data = M.fetch(num, '(RFC822)') 
     html = data[0][1] 

     soup = BeautifulSoup(html, 'lxml') 
     for a in soup.find_all('a', href=True): 
      print a['href'] 

jedoch die html Variable enthält HTML-Code, um eine neue Zeile alle N Zeichen haben, BeautifulSoup verhindert genau das href, besonders lange diejenigen zurückgab, der von der neuen Linie aufgespalten wurden.

Theres auch seltsame Zeichen wie =0D und 3D überall.

messages, <a=0D 
href=3D"http://links.google.com/wf/click?upn=3DOGGGYNMPA980E3DmngbHusD= 
Uo-2BK17XLM3ogFJfQXXXfMWZLdsQSSVv33HbPoHPXGcH8tSf9ZFFU5i-2FrV4O6ISlpDCIVaN5= 
83xr1CGoa5yxZimagE5JiSUAhbZH8P7WiNvf35BsXrCxmrmRLMGB-2BJAQ-3D-3D_IcMuwcQVVt= 
a699aeVjRRVxwBCNHkXaWO-2FyIlAqZ7CPsryDB24UVYZbMIvGLJb13chayC-2FLeucv-2FTrko= 
7LaiaWHkzy85DWXrK1olI1SEJZs-2BMCAWfoVfloGJivlLSH0GQk0XeVT0j383tZrsymuWLF0S2= 
q5j3LR91e76dRXQe7p8t5CgrBe-2FqGk6bmURG9XCNw3dwpHnymaR-2FggHQx6GnbbueF7PVp2H= 
-2BGoHUEkMOSXJ8FfSgQIiGICvxz1zcBJPw-2FRoE3YDl-2By8XETkXjVaNchNA1ZN8FDCD5VUf= 
V9oUOnavAirXX-2FEw1THfSpV4VYDX">unsubscribe</a></td>=0D 
       </tr>=0D 
       <tr>=0D 
        <td height=3D"12"></td>=0D 
       </tr>=0D 

Was können wir tun, um dieses Problem zu lösen?

+0

Sie können versuchen, das Extrahieren die 'href's verwenden regex, ohne abhängig von' BeautifulSoup' – shiva

Antwort

0

Sie können quopri verwenden, um die Quoted-printable Daten zu dekodieren:

Quoted-Printable oder QP-Codierung, ist eine Codierung druckbaren ASCII-Zeichen (alphanumerische und das Gleichheitszeichen „=“) 8-Bit-Daten zu übertragen über einen 7-Bit-Datenpfad oder allgemein über ein Medium, das nicht 8-Bit-sauber ist. 1 Es ist als MIME-Inhaltsübertragungscodierung für die Verwendung in E-Mail definiert.

QP arbeitet mit dem Gleichheitszeichen "=" als Escape-Zeichen. Es begrenzt auch die Zeilenlänge auf 76, da einige Software Beschränkungen für die Zeilenlänge hat.

html = """<a=0D 
href=3D"http://links.google.com/wf/click?upn=3DOGGGYNMPA980E3DmngbHusD= 
Uo-2BK17XLM3ogFJfQXXXfMWZLdsQSSVv33HbPoHPXGcH8tSf9ZFFU5i-2FrV4O6ISlpDCIVaN5= 
83xr1CGoa5yxZimagE5JiSUAhbZH8P7WiNvf35BsXrCxmrmRLMGB-2BJAQ-3D-3D_IcMuwcQVVt= 
a699aeVjRRVxwBCNHkXaWO-2FyIlAqZ7CPsryDB24UVYZbMIvGLJb13chayC-2FLeucv-2FTrko= 
7LaiaWHkzy85DWXrK1olI1SEJZs-2BMCAWfoVfloGJivlLSH0GQk0XeVT0j383tZrsymuWLF0S2= 
q5j3LR91e76dRXQe7p8t5CgrBe-2FqGk6bmURG9XCNw3dwpHnymaR-2FggHQx6GnbbueF7PVp2H= 
-2BGoHUEkMOSXJ8FfSgQIiGICvxz1zcBJPw-2FRoE3YDl-2By8XETkXjVaNchNA1ZN8FDCD5VUf= 
V9oUOnavAirXX-2FEw1THfSpV4VYDX">unsubscribe</a></td>=0D 
       </tr>=0D 
       <tr>=0D 
        <td height=3D"12"></td>=0D 
       </tr>=0D""" 


from bs4 import BeautifulSoup 
import quopri 

soup = BeautifulSoup(quopri.decodestring(html), "lxml") 
print(soup) 
print(soup.select_one("a")["href"]) 

Will Ausgang:

<html><body><a href="http://links.google.com/wf/click?upn=OGGGYNMPA980E3DmngbHusDUo-2BK17XLM3ogFJfQXXXfMWZLdsQSSVv33HbPoHPXGcH8tSf9ZFFU5i-2FrV4O6ISlpDCIVaN583xr1CGoa5yxZimagE5JiSUAhbZH8P7WiNvf35BsXrCxmrmRLMGB-2BJAQ-3D-3D_IcMuwcQVVta699aeVjRRVxwBCNHkXaWO-2FyIlAqZ7CPsryDB24UVYZbMIvGLJb13chayC-2FLeucv-2FTrko7LaiaWHkzy85DWXrK1olI1SEJZs-2BMCAWfoVfloGJivlLSH0GQk0XeVT0j383tZrsymuWLF0S2q5j3LR91e76dRXQe7p8t5CgrBe-2FqGk6bmURG9XCNw3dwpHnymaR-2FggHQx6GnbbueF7PVp2H-2BGoHUEkMOSXJ8FfSgQIiGICvxz1zcBJPw-2FRoE3YDl-2By8XETkXjVaNchNA1ZN8FDCD5VUfV9oUOnavAirXX-2FEw1THfSpV4VYDX">unsubscribe</a> 
<tr> 
<td height="12"></td> 
</tr> </body></html> 
http://links.google.com/wf/click?upn=OGGGYNMPA980E3DmngbHusDUo-2BK17XLM3ogFJfQXXXfMWZLdsQSSVv33HbPoHPXGcH8tSf9ZFFU5i-2FrV4O6ISlpDCIVaN583xr1CGoa5yxZimagE5JiSUAhbZH8P7WiNvf35BsXrCxmrmRLMGB-2BJAQ-3D-3D_IcMuwcQVVta699aeVjRRVxwBCNHkXaWO-2FyIlAqZ7CPsryDB24UVYZbMIvGLJb13chayC-2FLeucv-2FTrko7LaiaWHkzy85DWXrK1olI1SEJZs-2BMCAWfoVfloGJivlLSH0GQk0XeVT0j383tZrsymuWLF0S2q5j3LR91e76dRXQe7p8t5CgrBe-2FqGk6bmURG9XCNw3dwpHnymaR-2FggHQx6GnbbueF7PVp2H-2BGoHUEkMOSXJ8FfSgQIiGICvxz1zcBJPw-2FRoE3YDl-2By8XETkXjVaNchNA1ZN8FDCD5VUfV9oUOnavAirXX-2FEw1THfSpV4VYDX 

Wenn Sie die Hex-Zeichen 3D und 0D drucken, können Sie es sehen alle macht Sinn:

In [4]: print("\x3D") 
= 

In [5]: print("\x0D") 


In [6]: 
+1

Also * das ist warum die [base64] (http : //linux.die.net/man/1/base64) Dienstprogramm auf Linux umschließt Zeilen nach dem 76. Zeichen, es sei denn, Sie fügen '--wrap = 0' oder' -w 0' hinzu! Vielen Dank :) – jDo

Verwandte Themen