2017-02-17 21 views
0

내가 여기에, 웹 페이지에서 이메일을 추출하기 위해 노력하고있어 내 이메일 그래버 기능입니다 :InvalidSchema : 없음 연결 어댑터를 찾을 수 없습니다 python3.5.2

def emlgrb(x): 
    email_set = set() 
    for url in x: 
     try: 
      response = requests.get(url) 
      soup = bs.BeautifulSoup(response.text, "lxml") 
      emails = set(re.findall(r"[a-z0-9\.\-+_][email protected][a-z0-9\.\-+_]+\.[a-z]+", soup.text, re.I)) 
      email_set.update(emails) 
     except (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError): 
     continue 
    return email_set 

이 기능은 다른 기능에 의해 공급되어야하는 생성 url의 목록. 피더 함수 :

def handle_local_links(url, link): 
    if link.startswith("/"): 
     return "".join([url, link]) 
    return link 

def get_links(url): 
    try: 
     response = requests.get(url, timeout=5) 
     soup = bs.BeautifulSoup(response.text, "lxml") 
     body = soup.body 
     links = [link.get("href") for link in body.find_all("a")] 
     links = [handle_local_links(url, link) for link in links] 
     links = [str(link.encode("ascii")) for link in links] 
     return links 

제기 된 경우 빈 목록 (중요하지 않음)을 반환하는 많은 예외가 계속됩니다. 그러나 get_links에서 값을 반환()과 같이 : 물론

["b'https://pythonprogramming.net/parsememcparseface//'"] 

이 목록에있는 많은 링크가 (그것을 게시 할 수 없습니다 - 명성). 내가 수동으로 B와 중복 따옴표를 제거하지만 경우 : (연결 어댑터를 찾을 수 없습니다 InvalidSchema) - 그래서 목록은 다음과 같습니다 emlgrb() 함수는 목록을 처리 할 수 ​​없습니다

['https://pythonprogramming.net/parsememcparseface//'] 

emlgrb는() 작동합니다. 문제가 있거나 처음부터 두 번째 목록을 가져 오는 "정리 기능"을 만드는 방법에 대한 제안은 환영합니다.

감사

+0

.encode ('ascii')를 삭제하면 어떻게 출력됩니까? –

+0

실제로, 잘 작동합니다 - 고마워요. – scagbackbone

+0

str()에서 인코딩을 지정할 수도 있다고 생각합니까? 필요한 경우;) –

답변

0

이 솔루션은 당신이 코딩을 추가 할 수 있습니다 .encode('ascii')

def get_links(url): 
    try: 
     response = requests.get(url, timeout=5) 
     soup = bs.BeautifulSoup(response.text, "lxml") 
     body = soup.body 
     links = [link.get("href") for link in body.find_all("a")] 
     links = [handle_local_links(url, link) for link in links] 
     links = [str(link) for link in links] 
     return links 

을 드롭하는 것입니다 str()in this pydoc 같은 : 따라서 STR()가 object.__repr__() 또는 .__str__()를 호출하기 때문이다 str(object=b'', encoding='utf-8', errors='strict')

, 바이트이면 출력은 "b'string'"입니다. 사실 print(bytes_obj)을 할 때 인쇄됩니다. str 객체에 .ecnode()을 호출하면 bytes 객체가 생성됩니다!