파이썬 BeautifulSoup으로 게시글 제목 가져오기

조회수 813회

파이썬 셀레니움으로 로그인해서 게시판에 간후 페이지 소스를 받아와서 게시글 제목에 "날씨" 또는 "코로나" 라는 단어가 들어가는 글이 올라오면 글의 제목과 내용을 텔레그램 봇으로 보내려고 강의를보고 따라하고 있는데요

게시글 제목이 안가져와져서 도움을 구합니다

#윗부분 생략된소스는 셀레늄으로 로그인 하는부분
driver.get(url2)    #게시판이동
driver.implicitly_wait(15)
html = driver.page_source
soup = bs(html, 'html.parser')
subjects = soup.select('.item-subject')  #게시글 클래스 선택
print(subjects)

위의 소스를 실행시켰을때 아래처럼 잘 나옵니다

( "오늘의 날씨 이유", "날씨 너무춥네요 ㅠ" , "우한 코로나" 이부분이 글제목입니다)

# 게시글이 한페이지에 20개정도 나오는데  3개만 가져왔습니다

<a class="item-subject" href="https://123.com/bbs/board.php?bo_table=aboard01&amp;wr_id=5452">
<span class="orangered visible-xs pull-right wr-comment">
<i class="fa fa-comment lightgray"></i>
<b>+41</b>    #댓글수
</span>
<span class="wr-icon wr-new"></span> #새글을 알리는 아이콘           오늘의 날씨 이유        # 제목
        <b class="count orangered hidden-xs">+41</b>    #댓글수
</a>, 

<a class="item-subject" href="https://123.com/bbs/board.php?bo_table=aboard01&amp;wr_id=5451">
<span class="orangered visible-xs pull-right wr-comment">
<i class="fa fa-comment lightgray"></i>
<b>+19</b>
</span>
<span class="wr-icon wr-new"></span>                            날씨 너무춥네요 ㅠ
        <b class="count orangered hidden-xs">+19</b>
</a>,

 <a class="item-subject" href="https://123.com/bbs/board.php?bo_table=aboard01&amp;wr_id=5454">
<span class="orangered visible-xs pull-right wr-comment">
<i class="fa fa-comment lightgray"></i>
<b>+23</b>
</span>
<span class="wr-icon wr-new"></span>                            우한 코로나 
        <b class="count orangered hidden-xs">+23</b>
</a>

문제는 다음부분인데요 강의에서 select로 가져오는 클래스가 리스트가 되기때문에 텍스트를 못불러온다고 아래처럼 select_one을 사용해서 가져오라고해서

#윗부분 생략된소스는 셀레늄으로 로그인 하는부분
driver.get(url2)    #게시판이동
driver.implicitly_wait(15)
html = driver.page_source
soup = bs(html, 'html.parser')
subjects = soup.select('.item-subject')  #게시글 클래스 선택
for subject in subjects:
    print(subject.select_one('.item-subject').text)

강의내용에서 클래스이름만 바꿔서 위의 소스를 실행시키면 아래와같은 오류가 발생합니다

예외가 발생했습니다. AttributeError
'NoneType' object has no attribute 'text'
  File "C:\py\status.py", line 101, in <module>
    print(subject.select_one('.item-subject').text)

오류 내용을 보면 select_one('.item-subject') 이부분에 다른 클래스를 집어넣어야하는거같은데 페이지 소스로 가져온 걸보면 제목을 가르키는 클래스가 없어서 어떻게 가져와야할지 모르겠습니다 제목을 가져오려면 어떻게 해야할까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    subjects = soup.select('.item-subject')  #게시글 클래스 선택
    for subject in subjects:
        # print(subject.select_one('.item-subject').text)
        print(subject.text)
    

    .item-subject에서 .item-subject를 또 찾으면 안되겠죠.

    그런데 이렇게 하면 모든 텍스트 노드가 다 나와버리니까:

    subjects = soup.select('.item-subject')  #게시글 클래스 선택
    for subject in subjects:
        print(subject.select_one('span.wr-new').next_sibling)
    

    이렇게 최대한 접근한 다음 필요 없는 문자열은 필터링해서 쓰면 됩니다.


    • 알려주신대로 print(subject.text) 이렇게하니까 제목이랑 댓글수가 나오네요 그런데 아래에 알려주신 print(subject.select_one('span.wr-new').next_sibling) 이걸로하니까 'NoneType' object has no attribute 'next_sibling' 이런 에러가 뜹니다 nyw123 2020.2.6 13:08
    • 모든 게시글(.item-subject 단위)에서 해당 에러가 발생하나요? 만약 일부 게시물만 span.wr-new 태그가 없는거면 select_one이 NoneType이니 조건문 추가해보세요. 편집요청빌런 2020.2.6 14:00

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

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

(ಠ_ಠ)
(ಠ‿ಠ)