2016-07-03 10 views
2

私のスクリプトはimaplibで電子メールの受信トレイからHTMLコードを取得し、BeautifulSoupに渡して、hrefをすべて抽出しようとしています。改行でBeautifulSoupがデータを抽出できないようにする

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'] 

しかしhtml変数を正確にhref、新しいラインによって分割されており、特に長いものを返すからBeautifulSoupを防止し、新しい行ごとN文字を持っているHTMLコードが含まれています。

Theresは=0D3Dのような奇妙な文字もどこにでもあります。

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 

我々はこの問題を解決するために何ができますか?

+0

あなたが抽出試すことができます'BeautifulSoup'に依存せずに正規表現を使用する' href's – shiva

答えて

0

あなたはQuoted-printableデータを復号するquopriを使用することができます。

引用印刷可能、またはQP符号化は、印刷可能なASCII文字を使用して符号化(英数字および等号が「=」記号)は、8ビットのデータを送信することです7ビットデータパスを介して、または一般的には8ビットクリーンではない媒体を介して転送される。 1電子メールで使用するMIMEコンテンツ転送エンコードとして定義されています。

QPは、エスケープ文字として等号 "="を使用して動作します。また、ソフトウェアによっては行の長さに制限があるため、行の長さを76に制限します。

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"]) 

ウィル出力:あなたが進文字3D0Dを印刷する場合

<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 

が、あなたはそれをすべてを見ることができるが理にかなって:

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

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


In [6]: 
+1

だから* [base64](http ://linux.die.net/man/1/base64)Linuxのユーティリティは、 '--wrap = 0'や' -w 0'を付け加えない限り、76番目の文字の後に改行します!ありがとう:) – jDo

関連する問題