파이썬 Beautifulsoup 웹페이지 옵션정보 크롤링

조회수 610회

HTML 정보입니다.

<div class=:selectScroll">
    <div class ="wrap">
    <div class ="box" id ="option_all_view_area">
        <a class = "optionLine" name ="opt_select" optprdno="7042309496">
            <div class ="number">1</div>
            <div class ="option" name="opt_veiw_all_name_area">/225
        <a class = "optionLine" name ="opt_select" optprdno="7042309496">
            <div class ="number">2</div>
            <div class ="option" name="opt_veiw_all_name_area">/230
        <a class = "optionLine" name ="opt_select" optprdno="7042309496">
            <div class ="number">3</div>
            <div class ="option" name="opt_veiw_all_name_area">/235
        <a class = "optionLine" name ="opt_select" optprdno="7042309496">
            <div class ="number">4</div>
            <div class ="option" name="opt_veiw_all_name_area">/240

여기서 class = "option" 인 신발 사이즈(text 정보) 를 얻고 싶습니다.( 225, 230, 235, 240 만)

option_name = soup.find('a', class_='optionLine').find('div', class_='option').text

를 사용하니 옵션의 1번(맨위) 값만 얻어집니다...

option_name = soup.find_all('a', class_='optionLine').find_all('div', class_='option').text

을 하니 오류가 뜹니다...

option number를 통해서 구분해서 구해야 할것 같은데 어떻게 해야할지 감이 안잡히네요. ㅠㅠ

감사합니다.

1 답변

  • HTML이 엉망입니다. 인라인 태그인 <a> 내부에 <div>가 있고, 또 그 <div>는 닫히지도 않았고...

    그래서 아래 마크업이 원본이라고 가정하고 답변 드리면:

    <div class="selectScroll">
        <div class="wrap">
            <div class="box" id="option_all_view_area">
                <a class= "optionLine" name="opt_select" optprdno="7042309496">
                    <div class="number">1</div>
                    <div class="option" name="opt_veiw_all_name_area">225</div>
                </a>
                <a class= "optionLine" name="opt_select" optprdno="7042309496">
                    <div class="number">2</div>
                    <div class="option" name="opt_veiw_all_name_area">230</div>
                </a>
                <a class= "optionLine" name="opt_select" optprdno="7042309496">
                    <div class="number">3</div>
                    <div class="option" name="opt_veiw_all_name_area">235</div>
                </a>
                <a class= "optionLine" name="opt_select" optprdno="7042309496">
                    <div class="number">4</div>
                    <div class="option" name="opt_veiw_all_name_area">240</div>
                </a>
            </div>
        </div>
    </div>
    

    결론

    이렇게 고치세요.

    soup = BeautifulSoup(page_source, "html.parser")
    optionLines = soup.find_all('a', class_='optionLine')
    
    resultArr = []
    for ele in optionLines:
        resultArr.append(ele.find('div', class_='option').text)
    
    print(resultArr) # ['225', '230', '235', '240']
    

    설명

    find() 메서드는 주어진 조건에 해당하는 태그 딱 하나만 찾습니다. 보통은 위에서부터 찾으니 225만 나오는거구요.

    find_all() 메서드의 결과는 bs4.element.ResultSet 타입입니다. 이건 bs4.element.Tag의 묶음으로 보면 되는데요. ResultSet 타입은 find_all() 메서드가 없습니다. 그래서 에러가 나는거죠.

    • 감사합니다. 독학으로 배우다 보니, 필요한것만 배워서 HTML 문법을 몰라 그냥 옮겨적다 보니 틀린부분이 많았네요. 결과로 나온 정보의 타입이 달라서 일어나는 오류였군요 ㅠ 덕분에 잘 해결했습니다 감사합니다^^ 알 수 없는 사용자 2020.4.1 14:11

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)