[크롤링] 2장 고급 HTML 분석 - 4. 정규 표현식과 BeautifulSoup, 5. 속성에 접근하기, 6. 람다 표현식

채린·2023년 10월 2일
0
  1. 정규 표현식과 BeautifulSoup
    문자열 매개변수를 받는 대부분의 함수에 정규표현식 사용 가능

    ex 제품 이미지 url을 가져오자
    .findAll('img') -> 불필요한 로고, 숨은 이미지, 정렬에 쓰이는 빈 이미지 등이 포함
    => 태그 자체를 식별하는 무언가를 찾기: 제품 이미지 파일경로: ../img/gifts/img로 시작해서 .jpg로 끝

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import re
    
    html = urlopen('https://www.pythonscraping.com/pages/page3.html')
    bs = BeautifulSoup(html,'html.parser')
    
    images=bs.findAll('img',{'src':re.compile('\.\.\/img\/gifts/img.*\.jpg')})
    for image in images:
        print(image['src'])

    import re로 정규표현식 임포트

  1. 속성에 접근하기
    태그의 콘텐츠가 아닌 속성에 관심이 있을 때
    myTag.attrs로 태그 객체에서 속성 목록에 접근 가능 (딕셔너리 객체)
    ex) 이미지의 소스 위치: myImgTag.attrs[src]

  2. 람다 표현식
    람다 표현식: 다른 함수에 변수로 전달되는 함수
        f(x,y) 이외에 f(g(x),y), f(g(x),h(y))로 정의 가능

    BeautifulSoup에서 특정 타입의 함수를 findAll함수에 매개 변수로 넘길 수 있음
    이 함수는 반드시 태그 객체를 매개변수로 받고, 불리언만 반환 가능(TF반환하는 어떤 함수여도 상관x)
    모든 태그 객체를 이 함수에서 평가하고 True로 평가된 태그는 반환, 그렇지 않으면 버림

    ex bs.findAll(lambda tag: len(tag.attrs) == 2
         len(tag.attrs) ==2가 True로 평가되면 findAll함수가 그 태그를 반환
         결과: <div class='body' id='content'></div>
                   <span style='color:red' class='title'></span>

    람다함수 잘 응용하면 기본함수도 대체 가능
         bs.findAll(labda tag: tag.get_text() == '0r maybe he\'s only resting?')
         == bs.findAll('', text='0r maybe he\'s only resting?')

0개의 댓글