[Python] beautifulsoup4 를 사용해 크롤링 질문 있습니다.


  • Level 2

    ...
    <li class="aa">
        <img src='bb'>
        <br />
        아무 태그도 없는 텍스트
        <br />
        <em>em태그 텍스트</em>
    </li>
    <li class="aa">
        <span>span텍스트</span>
        <br />
        아무 태그도 없는 텍스트
    </li>
    ...
    

    와 같은 방식으로 구성돼있는 html사이트를 크롤링하고자 합니다.
    li태그 요소 내부의 모양이 li마다 다른 상태입니다.

    저 부분에서 '아무 태그도 없는 텍스트' 부분만 모두 가져오고자 하는데 좋은 아이디어가 있는지 궁금합니다.

  • Level 2

    @김철민 text() 부분을 beaurifulsoup4에서 딸 수가 없나 봐요.. NONE에러가 자꾸 나오네요 ㅠ 감사합니다

  • Level 2

    https://goor.me/p9GHH
    워크스페이스 공유 링크입니다.

  • Level 1

    저는 파이썬은 아니고 JAVA의 Jsoup으로 크롤링 코드를 짜곤하는데,

    간단한 구조라서 혹시하고 beautifulsoup 공식문서를 찾아보니
    https://www.crummy.com/software/BeautifulSoup/bs4/doc/#decompose
    https://www.crummy.com/software/BeautifulSoup/bs4/doc/#extract
    이런내용이 있어서!
    간단하게 해결 하실 수 있으실 것 같아서 첨부드립니다 🙂

    저도 간단히 짜봤는데 아래 참고해서 더 효율적으로 짜시길 바랄께요!

    [index.py]

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(open("./crawling.html"), "html.parser")
    
    li_tag = soup.select('li')
    
    result_text = []
    
    for tag in li_tag:
    
        em = tag.select('em')
        for extract_tag in em:
            extract_tag.extract()
            
        span = tag.select('span')
        for extract_tag in span:
            extract_tag.extract()
        
        result_text.append(tag.getText().strip())
    
    print(result_text)
    
    

    [crawling.html]

    <li class="aa">
        <img src='bb'>
        <br />
        아무 태그도 없는 텍스트
        <br />
        <em>em태그 텍스트</em>
    </li>
    <li class="aa">
        <span>span텍스트</span>
        <br />
        아무 태그도 없는 텍스트
    </li>
    

    [결과 값]

    ['아무 태그도 없는 텍스트', '아무 태그도 없는 텍스트']
    
  • Level 8

    • 제가 파이썬 개발자가 아니라서 답변이 서투를 수가 있습니다.. 요 부분 참고해주세요.

    그냥 CSS 선택자에 대해서 xpath 위치를 가리키게 하는건 어떨까요?
    li 태그 내 "아무 태그도 없는 텍스트"에 대해 제가 XPath로 위치를 확인해본 결과

    /html/body/li[1]/text()
    /html/body/li[2]/text()
    

    이렇게 나오더군요!

    결국 xpath를 가리킬 때 /html/body/li/text() 로 하는게 어떨까 싶습니다 🙂

ONLINE USERS

POPULAR TOPICS

SUGGESTED TOPICS

  • 4
  • 4
  • 7
  • 2
  • 2
  • 4
  • 4
  • 7