티스토리 뷰

728x90
반응형

 

 

 

import re
import requests as req
from bs4 import BeautifulSoup as bs

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
    'Referer': 'http://www.mydlink.co.kr/2013/beta_board/pds.php'
}
res = req.get("http://www.mydlink.co.kr/2013/beta_board/pds.php", headers=headers)
soup = bs(res.text, 'lxml')

script = soup.select("script")[6]
lst = re.findall(r'myform.isp2.options\[\d+\] = new Option\(\".*\"\);', script)
print(lst)

우선 문제의 코드는 위와 같습니다. re.findall 부분에서 아래와 같은 오류가 났는데요!

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_20396/326307934.py in <module>
      2 
      3 script = soup.select("script")[6]
----> 4 lst = re.findall(r'myform.isp2.options\[\d+\] = new Option\(\".*\"\);', script)
      5 print(lst)

c:\python39\lib\re.py in findall(pattern, string, flags)
    239 
    240     Empty matches are included in the result."""
--> 241     return _compile(pattern, flags).findall(string)
    242 
    243 def finditer(pattern, string, flags=0):

TypeError: expected string or bytes-like object

오류가 나게 된 원인은 이렇습니다.

re.findall(r'정규표현식', 문자열) 

두번째 인자에 문자열이 들어가야 되는데, 문자열이 들어가지 않아서 생긴 문제입니다.

제 코드에서 script 라는 변수는 soup.select("script")]6] 의 반환값은 print(script) 했을 때 문자열처럼 보이지만 사실은 BeautifulSoup 객체가 반환됩니다. 아래와 같은 형태입니다.

<class 'bs4.element.Tag'>

그렇기 때문에 만약에 객체를 두번째 인자로 사용하고 싶으시다면, 문자열 형태로 타입을 변환 시켜주어야 합니다.

아래 코드처럼 말이죠. str() 으로 script 변수를 감싸줌으로써 해당 오류 문제를 해결할 수 있습니다!

lst = re.findall(r'myform.isp2.options\[\d+\] = new Option\(\".*\"\);', str(script))

 

- 끝 -

728x90
반응형
댓글