묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C언어
\t 간격 차이
#include <stdio.h> #include <stdlib.h> struct kid { char name[100]; int height; }; int compare(const void* first, const void* second) { if (((struct kid*)first)->height > ((struct kid*)second)->height) return 1; else if (((struct kid*)first)->height < ((struct kid*)second)->height) return -1; else return 0; } int main() { struct kid my_friends[] = { "Jack Jack", 40, "Geenie", 300, "Aladdin", 170, "Piona", 150 }; const int n = sizeof(my_friends) / sizeof(struct kid); qsort(my_friends, n, sizeof(struct kid), compare); for (int i = 0; i < n; i++) printf("%s \t%d\n", my_friends[i].name, my_friends[i].height); return 0; }위는 저의 코드입니다.강의 5분 45초를 보면 printf()함수에 \t를 통해서 간격을 조정해주는데 교수님의 경우 숫자가 같은 위치에서 시작하는데 저는 왜 40 혼자 멀리 떨어져있을까요? 또 \t를 검색해보면 Tab키와 같이 일정한 간격을 띄움라고 나와있는데 일정한 간격을 어디를 기준으로 띄우는 건가요?"Jack Jack"의 경우 공백 포함 9글자고"Geenie의 경우 6글자인데강의에서 "40", "300"은 같은 위치에서 시작함에 의문이 생깁니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
영구 리다이렉션과 일시적 리다이렉션에 관한 질문입니다.
영구 리다이렉션의 경우 검색 엔진 등에서 기존 URL을 버리고 새로운 URL을 사용한다고 했고 일시적 리다이렉션은 리소스의 URL이 일시적으로 변경되고 검색 엔진 등에서는 URL을 변경하지 않는다고 하셨는데 리소스 URL을 변경한다, 유지한다의 개념이 헷갈려서 몇가지 질문드립니다. 1.여기서 말씀하신 리소스 URL이라는게 {host}/{resource}?{query_param} 에서 resource만을 의미하는 건가요?가령 http://google.com/event/4?q=hello 의 경우에 event/4 까지의 변경을 의미하는 것인가요?영구 리다이렉션과 일시적 리다이렉션의 차이는 resource name이 바뀌냐 안바뀌냐의 차이인건가요? 가령 /event로 post를 보냈을 때 /new-event로 post, get을 보내는 것이 영구적 리다이렉션, /event로 post를 보냈을 때 /event까지는 유지하고 /event/{id}로 post, get을 보내는 것이 일시적 리다이렉션 인가요?만약 2번이 맞다면 리소스의 URL이 일시적으로 변경된다는게 /event -> /event/{id}로 변경되는게 일시적 변경인거고 검색 엔진 등에서 URL을 변경하지 않는 것이 /event가 변경되지 않았다는 의미인건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
아무리해도 서버가 켜져있는데 접속이 안됩니다.
서버도 켜고 인바운드 규칙도 변경했는데 서버에선 22 이 르스닝으로 방화벽이 안뚫려서 접속이 안된거 같은데 어떻게 해결하나요ㅠㅠ
-
미해결바닥부터 시작하는 STM32 드론 개발의 모든 것
FS-i6 바인딩 안됨
안녕하세요 이번에 조종기와 수신기 관련해서 바인딩 하려고 했으나 바인딩이 안되고 있는상태입니다.강의자료와 동일하게 결선을 하였고 조종기 공장초기화 후 바인딩시도 했으나 binding ok메시지는 확인하였습니다. 하지만 실질적으로 디스플레이 상으로 바인딩 되지 않고 수신기도 바인딩 할때처럼 계속LED가 빠르게 점등하고 있어요. 혹시 문제점이 무엇인지 알고 계실까요?
-
해결됨코틀린 고급편
추상클래스의 공변 / 반공변, 추상 제네릭 일급컬랙션 리팩토링 에 대한 질문입니다.
믿고보는 태현님강의 다른강의 듣다가 사두고 이제서야 초반을 달리고 있습니다. 역시나 그간 알다가 까먹고 했던부분 확실하게 다지고 가는 느낌이 듭니다.저는 공변/반공변 예제 중 [꺼내기 / 저장] 각각의 기능만 하는 두가지 일급컬랙션을 따라하다가, 추상클래스 AbstractCage 를 둔다면 어떨지 아래처럼 한번 구성했었습니다. abstract class AbstractCage<T>( protected val things: MutableList<T>, )/** 초기화를 통해 아무거나 저장 후, 꺼낼수만 있는 케이지 */ private class ProduceCage<out T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ProduceCage T는 'out(공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun getFirst(): T = this.things.first() fun getAll(): List<T> = this.things.toList() }/** 아무거나 저장 만 가능한 케이지 */ private class ConsumeCage<in T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ConsumeCage T는 'in(반공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun put(vararg things: T) { this.things.addAll(things) } }문제는 상속받을때의 : AbstractCage<T>(..things) 선언부에 부모 T 타입이 무공변이라 자식 T 타입이 적절치 못하다고 애러가 나는데요,생각해보니 양쪽의 하위타입에서 이도저도 아닌 T 타입을 강요하는데, 이런 방식이 좋은 접근방식인가? 하는 의구심도 들고, 현업에서나, 또는 올바른 접근방법이 궁금해 질문하게 되었습니다. AbstractCage 의 타입파라미터를 <in T1, out T2> 이렇게 두는것도 이상하구요,이렇게 일급컬랙션 의 공통부분을 만들어야 될때 어떻게 접근해서 풀어내실지 의견이 궁금해서 남기게 되었습니다.읽어주셔서 감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트와 Unique 제약 조건에 대해 질문 있습니다.
영한님의 JPA 서적/강의로 JPA를 학습하는 동시에 개인 프로젝트를 병행하여 JPA에 대한 연습을 하고 있습니다.Unique 제약 조건을 추가하는 과정에서 궁금증이 생겨 질문 드립니다. 영속성 컨텍스트는 그 자체로 Unique 제약 조건을 검증하지 않나요?chatGPT에게 질문을 했을 때의 '영속성 컨텍스트는 unique 제약 조건을 확인하지 않고 DB에 해당 역할을 위임한다; 라고 대답하였는데, 달리 검증할 방법을 모르겠어 이곳에 질문 드립니다.아래와 같은 상황을 방지하기 위해서는 데이터 저장 로직에 em.flush()를 함께 써 주는 것이 가장 바람직한 접근 방법일까요?영한님의 다른 답변을 참고하면 데이터 저장의 빈도수가 상대적으로 적기 때문에 em.flush()를 한번 더 호출하는 것이 큰 성능 저하를 가져오지 않을 것 같고, 문제 해결도 되는 것 같습니다만, 제가 놓치는 부분이 있을까 하여 질문 드립니다.테스트에 @Rollback(value=false)를 추가하면 데이터가 예상한 대로 실패하던데, 해당 어노테이션의 유무가 어떤 차이를 가지기에 결과가 달라지는건지 함께 여쭤봐도 될까요??강의 내용에 대한 질문보다는, 강의 내용에 기반을 둔 프로젝트 질문이라 여기에 질문을 드려도 되는지 모르겠습니다만, 혹여나 도움을 받을 수 있을까 하여 질문 드립니다. '영속성 컨텍스트의 동작 원리' 쯤 내용들은 관련 자료가 쉽게 찾아지지 않아 궁금증을 어떤 식으로 해결할 수 있을지 모르겠습니다 ㅠㅠ질문 이해를 돕고자 아래에 문제 상황도 함께 추가하여 질문 드립니다. 배경 설명질문 상황이 이해가 쉽도록 최대한 간단히 프로젝트 구성 설명 드립니다.유저의 데이터를 저장하는 DAO를 구현 중입니다. User 모델@Entity @Table(name = "USERS") @Getter @Setter @NoArgsConstructor public class User { @Id @GeneratedValue @Column(name = "IDX") private Long idx; @Column(name = "NAME") private String userName; @Column(name = "ID", unique = true) private String id; @Column(name = "PASSWORD") private String password; }유저의 ID가 중복되지 않도록 ID 컬럼에만 @Column( ... unique = true) 를 사용하였습니다. UserDAO@Repository public class UserDAO { @PersistenceContext private EntityManager em; public long save(User user){ em.persist(user); return user.getIdx(); } //... } 마지막으로, Unique 제약 조건을 확인하기 위한 테스트 코드 입니다.중복되는 ID 값을 가진 유저를 저장할 때 어떤 예외가 발생하는지 직접 확인하기 위해 실패하는 테스트 코드를 작성하였습니다. UserDAOTest @ExtendWith(SpringExtension.class) @SpringBootTest class DBUserDAOTest { @Autowired UserDAO userDAO; @Test @Transactional public void sameIdSaveTest(){ //given DBUser user1 = new DBUser("User1", "sameId", "PW1"); DBUser user2 = new DBUser("User2", "sameId", "PW2"); //when long savedIdx1 = userDAO.save(user1); long savedIdx2 = userDAO.save(user2); //that } 문제 상황동일한 ID 값인 "sameId"를 사용했음에도 문제가 없이 테스트가 통과하는 모습입니다. 로직 변경public long save(DBUser user){ em.persist(user); em.flush(); return user.getIdx(); }위와 같이 em.flush()를 추가하면 예상과 같이 테스트가 실패합니다.DataIntegrityViolationException이 발생합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의 약 10분부근 @RequestMapping 404
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 약 10분 부근에@Controller 를 주석처리하고@Component@RequestMapping 을 어노테이션으로 입력하고 실행하면에러가 뜨네요 ?@Controller로 하면 잘 되는데 강의와는 다르게 안되네요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
해쉬 충돌에 대해 질문드리고 싶습니다.
해쉬 충돌에 대해서 제대로 이해하고 싶어서 다른 자료를 찾아보다가 이해가 안되는 부분이 있어서 질문드립니다.전제 : Key값은 상수 데이터이다.그림 설명만 놓고 보면 키값이 달라도 해쉬 버켓 값이 동일해서 해쉬 충돌이 일어날 수 있다라고 설명하는 것 같은데, 서로 다른 키가 같은 해쉬 버켓에 매핑 될 수 있는 경우가 해쉬 함수의 성능에 의해 결정되는지 궁금합니다. 더불어 대체적으로 어떤 경우에서 해쉬 충돌이 빈번한지에 대해 질문 드리고 싶습니다.
-
해결됨[코드캠프] 강력한 CSS
노션 학습 링크
노션 학습 자료 링크는 어디서 볼 수 있나요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
python3 manage.py showmigrations 에서 오류
# python3 manage.py showmigrationsTraceback (most recent call last): File "manage.py", line 21, in <module> main() File "manage.py", line 17, in main execute_from_command_line(sys.argv) File "/usr/local/lib/python3.6/dist-packages/django/core/management/__init__.py", line 401, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.6/dist-packages/django/core/management/__init__.py", line 395, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.6/dist-packages/django/core/management/base.py", line 328, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.6/dist-packages/django/core/management/base.py", line 369, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.6/dist-packages/django/core/management/commands/showmigrations.py", line 52, in handle return self.show_list(connection, options['app_label']) File "/usr/local/lib/python3.6/dist-packages/django/core/management/commands/showmigrations.py", line 71, in show_list loader = MigrationLoader(connection, ignore_no_migrations=True) File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/loader.py", line 49, in init self.build_graph() File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/loader.py", line 274, in build_graph raise exc File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/loader.py", line 248, in build_graph self.graph.validate_consistency() File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/graph.py", line 195, in validate_consistency [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/graph.py", line 195, in <listcomp> [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "/usr/local/lib/python3.6/dist-packages/django/db/migrations/graph.py", line 58, in raise_error raise NodeNotFoundError(self.error_message, self.key, origin=self.origin)django.db.migrations.exceptions.NodeNotFoundError: Migration accounts.0001_initial dependencies reference nonexistent parent node ('auth', '0012_alter_user_first_name_max_length')powershell에서 python3 manage.py showmigrations명령을 수행했을때 위와같은 오류가 뜨네요.. 뭐가 문제인걸까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
put과 post에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. put은 리소스를 완전 대체하기 때문에 데이터의 부분적인 필드만 보낼 시에 부분적인 필드만 대체되거나 새롭게 추가된다고 하셨는데, post로 put을 대체하여 사용할 경우도 마찬가지의 동작이 되나요? 가령 전체 데이터필드는 "username", "age"가 있는데 post로 "age" 필드만 바디로 보낼 경우, put과 같이 "username"없이 "age"만 대체, 추가가 되는 건지요?아니면 애초에 put은 리소스에 식별자를 추가해야되기 때문에 post로 대체 될 수 없는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
./gradlew clean build 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 저는 현재 springboot 2.7.16버전 사용 중입니다. 배포파일 만드는 과정에서 ./gradlew clean build를 했는데 에러가 발생합니다.해결 방법이 있을까요?ㅠ
-
미해결스프링 핵심 원리 - 기본편
prototype 스코프 사용 시 proxymode
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]request 스코프 사용 시 @Scope 에서 proxymode 추가하는 것으로, 코드가 간단해지는 것을 보고, prototype 스코프에도 적용해보려고 했는데, 오류가 발생하였습니다.질문게시판에서 답변이 되는 글을 찾아서 궁금증은 풀렸는데요, (https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55396&tab=community&category=questionDetail&q=560062)그렇다면 결론적으로 prototype 스코프에서는 proxymode를 사용할 수는 없고, provider를 사용하는 것이 최선일까요? 감사합니다
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
트와이스 앱 관련해서 질문 있습니다.
안녕하세요? 강의를 보고 따라했는데 강사님의 앱 실행 화면과제 앱 실행 화면이 달라서 문의드립니다.맨 오른쪽에 있는 라인의 사진들이 비율이 맞지 않는 것처럼 보이는데,혹시 해결 방법이 있을까요?2. Toast를 기입하고 앱 실행을 했는데 에러가 났다고 하면서 실행이 되지 않는데 이것도 해결 방법이 있을까요?감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-K lis 배열과 ans의 차이
안녕하세요 선생님.코드는 선생님의 코드를 참고 하여 질문드립니다!코드 이해를 위해 디버깅을 하는 중 테스트 케이스로610 20 9 30 8 50위 값들을 넣었을 때,출력되는 값은410 20 30 50 이지만lis 배열에 남은 값은8 20 30 50 이었습니다.제가 아직 lis 배열의 의미와*lowerPos = num; 으로 바꿔주는 부분에 대해 잘 이해하지 못한 것 같습니다.lis 배열은 그저 정답을 구하기 위한 임시적인 배열이 맞을까요?
-
미해결지금 당장 NodeJS 백엔드 개발 [사주 만세력]
데이터베이스 스키마 생성 부분에서 중간에 짤린 것 같습니다. 명령어요
데이터베이스 스키마 생성 부분에서 중간에 짤린 것 같습니다. 명령어요
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
교차 검증 시에 계수나 규칙이 계속 바뀌는건가요?
안녕하세요 교차검증에 대해 잘 이해가 안되서요 ㅠㅠ만약 3번 교차검증을 한다했을 때첫번째 학습을 하고 나서 두번째 학습시에 첫번째 모델을 기반으로 분류라면 분류규칙이라든지 회귀라면 회귀계수가 변경이 된고 셋번째 학습시에 두번째 모델을 기반으로 변경이 계속 되는건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
yarn generate 실행시 YAML Error 발생하는 분들!
참고 - https://stackoverflow.com/questions/19975954/a-yaml-file-cannot-contain-tabs-as-indentationcodegen.yaml 파일에서 들여쓰기를 모두 지우고 띄어쓰기(space 키) 2번씩으로 바꿔주시면 해결됩니다!(plugins와 config는 띄어쓰기 4번, - typescript와 typesPrefix: I 는 띄어쓰기 6번, 이런식으로)
-
해결됨삼각형의 실전! CMake 초급
CMake 심화 - CMake 설치 실습 관련 문제
안녕하세요. 강의 정말 잘 들었습니다. 완강하고 나서 cmake 개념이 잘 잡혀서 실무에 도움이 많이 될 것 같습니다.실습을 수행하던 도중 install 실습에서 문제가 발생했는데요. 강의는 "CMake 심화 - CMake 설치" 입니다.강의 영상과 동일한 명령어를 수행했음에도 installing이 수행되지 않는 증상입니다.cd installing mkdir build cd build cmake ..위 작업은 정상적으로 수행이 잘 되고, 아래와 같은 출력결과가 나옵니다.-- The C compiler identification is AppleClang 14.0.3.14030022 -- The CXX compiler identification is AppleClang 14.0.3.14030022 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- BINDIR: bin -- LIBDIR: lib -- INCLUDEDIR: include -- DATAROOTDIR: share -- Configuring done (0.8s) -- Generating done (0.0s) -- Build files have been written to: /Users/user/wd/practice-cmake/installing/build 이후 강의에서는 아래 명령어를 수행하는데, install이 수행되는 것이 아닌 다시 cmake configure와 generate 과정이 수행되는 것으로 보입니다.cmake .. --install-prefix=/Users/user/wd/practice-cmake/installing/build/install다음과 같은 출력결과가 나옵니다.-- BINDIR: bin -- LIBDIR: lib -- INCLUDEDIR: include -- DATAROOTDIR: share -- Configuring done (0.1s) -- Generating done (0.0s) -- Build files have been written to: /Users/user/wd/practice-cmake/installing/build MacOS와 Ubuntu 환경에서 모두 동일하게 문제가 발생했는데요, 제가 어떤 부분을 빠뜨린 것인지 궁금합니다.감사합니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
크롤링 에러 관련 문의
안녕하세요.아래 코드를 사용해서 '식품 로봇'이라는 검색어로 크롤링을 시도했는데요. URL에 지정한 기간에 존재하는 모든 기사를 수집하고자 하는데, 총 몇 페이지나 있는지 알 수가 없어서.. 페이지수를 2,000으로 넣어서 실행 해보았습니다.그런데, 크롤링이 잘 진행되다가 에러가 발생해서요. 혹시 이건 어떻게 수정할 수 있을지요?에러 문구:=======링크======= https://n.news.naver.com/mnews/article/025/0003239249?sid=101 Traceback (most recent call last): File "/Users/유저이름/startcoding/Chapter04/11.마지막페이지확인하기.py", line 64, in <module> print("=======제목======= \n", title.text.strip()) ^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'text'실행 코드:import requests from bs4 import BeautifulSoup import time import pyautogui from openpyxl import Workbook from openpyxl.styles import Alignment # 사용자입력 keyword = pyautogui.prompt("검색어를 입력하세요") lastpage = int(pyautogui.prompt("몇 페이지까지 크롤링 할까요?")) # 엑셀 생성하기 wb = Workbook() # 엑셀 시트 생성하기 ws = wb.create_sheet(keyword) # 열 너비 조절 ws.column_dimensions['A'].width = 60 ws.column_dimensions['B'].width = 60 ws.column_dimensions['C'].width = 120 # 행 번호 row = 1 # 페이지 번호 page_num = 1 for i in range(1, lastpage * 10, 10): print(f"{page_num}페이지 크롤링 중 입니다.==========================") response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={keyword}&start={i}") html = response.text # html은 response의 text 안에 위치함 soup = BeautifulSoup(html, 'html.parser') articles = soup.select("div.info_group") #뉴스 기사 div 10개 추출 # 기사가 10개니까 for문을 써서 하나하나 추출 필요 for article in articles: links = article.select("a.info") # a 태그, info class인 아이들을 가져옴. = 리스트 if len(links) >= 2: # 링크가 2개 이상이면 url = links[1].attrs['href'] # 두번째 링크의 href를 추출 # 다시 request 날려주기 response = requests.get(url, headers={'User-agent': 'Mozila/5.0'}) html = response.text soup_sub = BeautifulSoup(html, 'html.parser') print(url) # 연예 뉴스 체크 if "entertain" in response.url: title = soup_sub.select_one(".end_tit") content = soup_sub.select_one("#articeBody") elif "sports" in response.url: title = soup_sub.select_one("h4.title") content = soup_sub.select_one("#newsEndContents") # 본문 내용 안에 불필요한 div, p 삭제 divs = content.select("div") for div in divs: div.decompose() paragraphs = content.select("p") for p in paragraphs: p.decompose() else: title = soup_sub.select_one(".media_end_head_headline") content = soup_sub.select_one("#newsct_article") print("=======링크======= \n", url) print("=======제목======= \n", title.text.strip()) print("=======본문======= \n", content.text.strip()) ws[f'A{row}'] = url # A열에는 URL 기입 ws[f'B{row}'] = title.text.strip() ws[f'C{row}'] = content.text.strip() # 자동 줄바꿈 ws[f'C{row}'].alignment = Alignment(wrap_text=True) row = row + 1 time.sleep(0.3) # 마지막 페이지 여부 확인하기 isLastPage = soup.select_one("a.btn_next").attrs['aria-disabled'] if isLastPage == 'true': print("마지막 페이지 입니다.") break page_num = page_num + 1 wb.save(f'{keyword}_result.xlsx')