2016-07-03 4 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

당신은 추출 시도 할 수 있습니다 'href'는'BeautifulSoup'에 의존하지 않고 정규 표현식을 사용합니다 – 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