왈조
20
2020-06-25 14:18:18 작성 2020-06-25 14:20:51 수정됨
3
635

크롤링한 내용을 csv로 내보내고싶은데 마지막 줄 밖에 내보내지지않습니다.



##main.py
##main module
##import pack : time(sleep) / bs4 / request

import sys
import csv
import time
import requests
from bs4 import BeautifulSoup

#시작 텍스트 출력
print('마나모아넷 제목검색기.')
print('loading...')
##time.sleep(2)



print('')
print('')
suchname = input("검색어를 입력하세요 : ")

## such page 1 GET Request / <div class="manga-subject"> 이 클래스 아래아래 이름존재
req1 = requests.get('https://manamoa48.net/bbs/search.php?url=https%3A%2F%2Fmanamoa48.net%2Fbbs%2Fsearch.php&sfl=0&stx='+suchname)
## HTML source GET
html = req1.text
## HTTP Header GET
header = req1.headers
## HTTP Status GET
status = req1.status_code
## HTTP Chack (True/Fales)
is_ok = req1.ok

##html 변수파일을 사용하며, python 내장의 html.parser 사용.
soup = BeautifulSoup(html, 'html.parser')
##CSS Selector을 통해 제목요소 특정
my_titles = soup.select('div.post-row > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > a:nth-child(1)')

##1차 결과 및 저장 : 검색된 제목을 csv 파일로 저장 및 화면에 출력
for title in my_titles:
    list = []
    list.append(title.get_text().strip("\n\t"))
    file = open('list.csv','w',encoding='utf-8',newline='')
    wr = csv.writer(file)
    wr.writerows(list)
    file.close()
    print(list)
    print(type(list))
#file = open('list.txt','w')
#file.write(title.text.strip())
#file.close()

time.sleep(2)


1. 만화 웹페이지에서 만화 제목을 검색하고.

2. 만화 제목목록중 선택하면 몇회차 또는 몇권까지 있는지 확인하도록.


인터넷을 여러곳 찾아보며 코드를 작성해보았습니다.


1차적인 검색내용 출력까진 가능하지만, 여기서 저장(내보내기)하는데 문제가있어 도움을 받으려합니다.


처음에 내용을 전달받으니 str 속성으로 문자열이 들어오고,

txt파일로 저장하니 첫줄 빈줄, 두번째줄 마지막내용 으로 저장이되길래


csv에 대한 내용을 유튜브에서 보고, csv/list로 저장하는 방법을 그대로 적용하였으나

제대로 출력이 되지 않습니다.

strip 함수를 계속 수정해보고있으나 제대로 되지않아 방법을 알고싶어 질문드립니다 ㅜㅜ


ex) 가,나,다,,라,마 (글자하나하나 끊어짐 및 마지막 줄만 저장됨.)

ex2) 가,

나,

다,

라 (아예 줄바꿈이되어버림 및 마지막 줄만 저장됨.)

0
  • 답변 3

  • howoni123
    1k
    2020-06-25 15:08:21 작성 2020-06-25 15:09:28 수정됨
    file = open('list.csv','w',encoding='utf-8',newline='')
    wr = csv.writer(file)
    for title in my_titles:
        list = []
        list.append(title.get_text().strip("\n\t"))
        wr.writerows([list])
        print(list)
        print(type(list))
    file.close()

    마지막부분만 수정했서요

    csv 모듈 사용하실때 한 row에 대해서 리스트 지정해주셔야지 한줄로 입력되고요(글자사이에 ,안생김)

    file 입출력할때 'w'로 하시면 파일열릴때마다 기존내용 다지웁니다. 위 코드 처럼 for문 돌기전에 밖으로 꺼내시거나 'a+' 로 사용하세용

  • 왈조
    20
    2020-06-25 15:18:34

    @howoni123

    웹에 있는 내용을 한번에 가져오는게아니라 for문 안에서 여러번 실행하는거라 close가 밖으로 나와야되는거군요...

    list는 함수로 사용하면 str이든 list던 알아서 처리해주는줄 알았는데 역시 하나하나 알려주어야하는 코딩은.. 조금 어렵네요.. ㅜㅜ

    답변 감사합니다! 답변해주신 내용에관련해서 더 잘 알수있게 되었습니다!!

  • howoni123
    1k
    2020-06-25 15:42:19

    왈조 

    아뇨 for문 안에 있어도 되는데 그때에는 'a+'로 해야해용.

    하지만 이 경우라면 파일이 지워지지 않으니 기존자료에서 계속 덧붙여가면서 이어지겠죠

    그리고 csv 저거 무슨 이유때문인지 모르지만 저도 csv모듈활용할때 저렇게해야 되더라구요

    당시에 stackoverflow에서 찾아봤던걸로 기억합니다.

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