본문 바로가기
코딩 연습/코딩배우기

파이썬 pytube 오류 메시지 - AttributeError: 'NoneType' object has no attribute 'span'

by good4me 2021. 12. 19.

goodthings4me.tistory.com

 


파이썬 pytube 라이브러리 사용 시에 발생한 오류메시지 AttributeError: 'NoneType' object has no attribute 'span'에 대한 해결..?

유튜브 영상 다운로드 코딩 시 발생한 오류 메시지

- AttributeError: 'NoneType' object has no attribute 'span'

 

수년 동안 관심 있는 분야를 스터디를 할 때 clip으로 유튜브 영상을 받고 스마트폰이나 노트북에 받은 영상을 저장하여 도서관이나 스터디 카페 등에서 보곤 하였다.

그런데, 최근 clip을 통해 필요한 유튜브 영상을 받으면 .webm 확장자로 다운로드되고 실행을 하면 소리가 나오지 않는 현상이 나왔다.

clip으로 유튜브 영상 한 개씩을 받으면 mp4로 받을 수 있으나 시리즈 영상을 한 번에 받으면 .webm 확장자 파일이 다운로드되는 듯하다. 

mp4로 다시 받는 방법이나 .webm에 음성까지 같이 받는 방법을 찾아보진 않았다.

그래서 파이썬 pytube로 시리즈 영상으로 된 파일을 받을 수 있는지 확인하다가 방법을 찾긴 했는데(requests-html 라이브러리 같이 사용), 문제는 실행 시 pytube에서 위와 같은 에러가 발생한다는 것이다.

 

구글에서 해결책을 찾아서 보니,
pytube 설치 디렉토리에 있는 parser.py 파일에서 일부 소스를 수정하는 방법이 있었다.

# 참고 사이트
https://hengbokhan.tistory.com/196
https://stackoverflow.com/questions/70060263/pytube-attributeerror-nonetype-object-has-no-attribute-span

anaconda에서 \pytube\parser.py를 찾았으나 안 나왔다.
아차! 싶은 것이 가상환경에 pytube를 설치했기 때문에 가상환경에 있겠다 싶어 다시 찾아보니 가상환경  venv\Lib\site-packages\pytube 디렉토리에 parser.py 파일이 있었다.


good4me.co.kr


parser.py 파일 일부 소스

 

    results = []
    curr_substring = js_array[1:]

    comma_regex = re.compile(r",")
    func_regex = re.compile(r"function\([^)]*\)")

152번째 줄 소스
func_regex = re.compile(r"function\([^)]*\)") 에서 *\ 부분을 ?\으로 수정
func_regex = re.compile(r"function\([^)]?\)")

 

그러나, 고쳤을 때 정상 실행이 안된다고 하는 답변도 있어서 해당 소스를 수정하지 않고,

 

pip install git+https://github.com/baxterisme/pytube 또는 
pip install git+https://github.com/nficano/pytube.git 해보라는 정보도 있었서 설치된 pytube를 삭제(pip uninstall pytube)하고 위 코드를 실행했으나 안되었다.

 

혹시, 하는 생각에 pytube를 재 설치하고 실행해보니 정상적으로 다운로드가 진행되었다. (물론 이것이 정답이 아닌 듯 한데... 버전 업데이트 문제인지 모르지만 해결은 되었다)

같은 오류가 다시 발생하면 parser.py 소스 수정도 해볼 필요가 있을 듯 하다. (결과는 나중에 첨언 예정)

 


실행되던 코드로 유튜브 영상을 다운로드해보니 다시 에러가 발생했다. (2022. 2. 2 확인)

정확히 언제부터 에러가 발생했는지는 알 수가 없었고,

문제는 단순한 업데이트 방식(삭제 후 재 설치)으로는 해결이 안되었고 parser.py 152 line 수정을 해도 안되었다.

 

다시 구글에서 한 참을 찾아서 하나의 해결 방법을 찾았다.

cipher.py 파일을 다음과 같이 수정해서 정상화되었다. (하지만, 이것이 정답인지는 모르며, pytube 11.0.2 버전 기준임)

line 293 of cipher.py
name = re.escape(get_throttling_function_name(js)) 부분을
name = "iha" 로 수정

 

2/3(목) 오전에 다시 확인을 하니 또 오류 발생, 실행이 되다가 안되는 이유는?

방법이 없는 것인가!!

 

 

 

 

 

 

 

댓글