오예예
144
2020-03-31 15:53:13
4
444

파이썬 beautifulsoup를 이용한 for 문 질문입니다


안녕하세요! 저번에 주신 도움들 때문에 계속해서 프로젝트를 진행할 수 있었습니다. 감사합니다.

다름이 아니라 제가 학교 커뮤니티 사이트에서 게시글 제목과 좋아요 수를 셀레니움과 beautifulsoup을 활용해 for 문을 이용해서 추출하려고 합니다.


def next_page():
    driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()
    time.sleep(0.5)
    
    res = driver.page_source
    soup = BeautifulSoup(res,"html.parser")
    data_name = soup.select('h2')
    data_num =soup.select('.vote')
    
    for data_name_list in data_name:
        print(data_name_list.get_text())
    
    for data_num_list in data_num:
        print(data_num_list.get_text())

 이 부분이 제가 작성한 코드인데 결과를 출력하면


이렇게 글 따로 숫자 따로 나열이 됩니다..

제가 원하는 방향은 



등록금 29

올해 합격한 분들 축하해요 43

아까 저한테 패드립 했던 익명님 28




이렇게 출력이 되도록 짜고 싶어서 코드를 수정했는데


def next_page():
    driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()
    time.sleep(0.5)
    
    res = driver.page_source
    soup = BeautifulSoup(res,"html.parser")
    data_name = soup.select('h2')
    data_num =soup.select('.vote')
    data_sel = data_name, data_num
    
    for data in data_sel:
        print(data.get_text())


이렇게 for 문에 두 개의 입력값을 넣으려고 해봤지만 잘 안됩니다..

어떻게하면 




등록금 29

올해 합격한 분들 축하해요 43

아까 저한테 패드립 했던 익명님 28




이렇게 나열하게 코드를 짤 수 있을까요..? 부탁드립니다 ! ㅜㅜ

0
  • 답변 4

  • 페코옹
    1k
    2020-03-31 16:12:04

    두가지 방법이 있겠네요.

    첫번째는 zip에 넣는 방법이고

    두번째는 find 할때 상위 tag 리스트를 가져와서 for문안에서 select 및 gettext 하시면 될 것 같습니다^^

  • 오예예
    144
    2020-03-31 17:32:07 작성 2020-03-31 17:32:34 수정됨

    첫 번째 방법으로 하는게 url주소도 가져오기 편할 거 같아서 바로 zip을 공부하고 실행했더니 성공했습니다!

    감사합니다 !!

    죄송하지만 추가적인 질문이 있는데 가능하실까요..?


    #beautifulsoup으로 h2, vote 가져와서 zip으로 그룹화 시키기
    def next_page():
        driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()
        time.sleep(0.5)
        
        res = driver.page_source
        soup = BeautifulSoup(res,"html.parser")
        data_name = soup.select('h2')
        data_num =soup.select('.vote')
        
        for data in zip(data_name,data_num):
            print(data) 
    #data.get_text()를 넣고 싶었지만 입력 불가
        
      
    #다음장으로 넘기기 코드    
    driver.find_element_by_xpath('//*[@id="sheet"]/ul/li[3]/a').click()
    time.sleep(0.5)
    for page_roof in range(3):
        next_page()
    
        
    driver.quit()

    깔끔하게 보기 좋게 텍스트만 가져오고 싶었는데 get_text가 먹히지가 않네요..

    이걸 사용하려면 두 번째 방법으로 사용하는 것 밖에는 방법이 없을까요??

  • 페코옹
    1k
    2020-03-31 17:47:24

    zip을 for문으로 돌리면 튜플이 나옵니다.

    튜플에는 data_name과 data_num이 쌍쌍으로 들어있을거에요.

    data[0], data[1]

    로 접근하시거나..

    혹은 data로 받지 마시고 name, num으로 받으시거나 ..

    편하신 걸로 선택하시면 됩니다.

  • 오예예
    144
    2020-03-31 17:58:37

    name과 num으로 받았더니 원하는 결과물이 나왔습니다!! 정말 감사합니다 ㅠㅠㅠ

    2개로 받는 거 배웠던건데 아직 익숙치 않다보니 떠오르지 않았네요!!

    덕분에 작업이 수월해졌습니다 감사합니다!!

  • 로그인을 하시면 답변을 등록할 수 있습니다.