• 목록
  • 아래로
  • 위로

안녕하세요? 주말 잘 보내고 계시는지요?


파이썬 3.X에서 유니코드 문자열의 처리와 관련하여 질문 드립니다 ^^



https://www.apt2you.com/houseSaleSimpleInfo.do


Selenium을 이용하여 이 사이트를 크롤링하는 스크립트를 작성했는데요.



html = driver.page_source

soup = BeautifulSoup(html, 'html.parser')

names = soup.find_all('a', {'href':'#laySale'})



일단 이런 방식으로 해서 크롤링을 하고



names = [name.text.strip() for name in names]



이렇게 문자열 처리를 한 후에 다시 names 리스트에 넣어서 리스트를 출력하면 캡쳐화면처럼 유니코드 3000 문자가 포함되어 있네요.



반면 for name in names로 print(name)을 하면 유니코드가 두 칸의 공백의 형태로 보이네요.



제가 궁금한 점은 다음과 같습니다.


1. 리스트 자체를 출력하는 것과 리스트의 원소를 출력하는 것에 차이가 발생하는 이유는 무엇인가요?


2. replace 메소드를 이용하여 u'u3000'을 ' '로 바꾸거나, 두 칸의 공백 '  '을 한 칸의 공백 ' '으로 바꾸는 것이 잘 안 되네요 ㅠㅠ


파이썬 3.X에서는 유니코드가 자동 변환이 되기 때문에 


name.replace('\u3000', ' ') 또는 name.replace('\\u3000', ' ')가 먹힐 것 같은데 


아무리 시도해봐도 바뀌는 것이 없이 그대로 출력되네요 ㅜㅜ



기초적인 질문 같은데 해결책을 찾지 못하고 있네요 ㅠㅠ


그럼 즐거운 주말 되시고, 답변해주실 분께 미리 감사드립니다!

작성자
이니스프리 119 Lv. (2%) 4174900/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 6

title: 황금 서버 (30일)humit
profile image

name.replace('\u3000', ' ') 로 하면 동작할텐데요..??

 

from bs4 import BeautifulSoup

import requests

 

url='https://www.apt2you.com/houseSaleSimpleInfo.do'

html = requests.get(url).content

soup=BeautifulSoup(html, 'html.parser')

names = soup.find_all('a', href='#laySale')

names = [name.text.strip().replace('\u3000', ' ') for name in names]

 

print(names)

comment menu
2019.10.13. 00:04

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

허걱 ㅠㅠ 잘 되네요! 바쁘신데 리플 달아주셔서 감사합니다 ^^

for 문으로 따로 돌려서 replace할 때에는 안 되었는데

댓글에 올려주신대로 리스트 컴프리헨션으로 처리하니깐 잘 되네요 ㄷㄷ

아마도 제가 어느 부분에선가 실수한 것 같네요 ㅠㅠ

 

혹시 replace하기 이전 상태에서 리스트 자체를 출력하면 \u3000이 그대로 보이고

for name in names로 print(name)을 출력하면 두 칸 공백으로 보이는 것의 차이는 어떠한 이유로 발생하는 것인지 여쭤봐도 될까요?

그럼 편안한 주말 되시고 새벽 날씨가 쌀쌀한데 감기 조심하세요!

항상 감사드립니다 ^-^



for 문으로 출력한 결과




리스트 자체를 출력한 결과

comment menu
2019.10.13. 00:34

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image

replace의 경우에 문자열을 직접 수정하는 것이 아니라서 대입하는 과정이 있어야 합니다. 아마 그냥 replace 함수로만 사용하셔서 그랬던 것 같네요.

comment menu
2019.10.13. 00:42

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

앗 감사합니다! 생각해보니 말씀해주신 그 부분을 실수했네요 ^^

제가 8월 이후로 계속 바쁘게 지내서 오래간만에 코딩을 하다보니 많이 잊어버렸네요 ㅠㅠ

혹시 제가 캡쳐한 1번과 2번의 차이는 무엇 때문일까요?

 

반복문에서는 print 함수가 반복하여 실행되어 반복될 때마다 별도의 행에 출력되고,

리스트 자체를 출력하면 대괄호 안에 따옴표로 원소를 표시하는 것까지는 이해를 했는데요.

유니코드 자체를 출력하는지 여부가 달라지는 이유가 이해가 안 되어서요 ㅜㅜ

아주 기본적인 내용일 것 같은데 계속 생각을 하고 구글링을 해봐도 어떤 이유 때문인지 모르겠네요 ㅠㅠ

 

1.

url='https://www.apt2you.com/houseSaleSimpleInfo.do'

html = requests.get(url).content

soup=BeautifulSoup(html, 'html.parser')

names = soup.find_all('a', href='#laySale')

names = [name.text.strip() for name in names]

for name in names:

    print(name)

 

2.

url='https://www.apt2you.com/houseSaleSimpleInfo.do'

html = requests.get(url).content

soup=BeautifulSoup(html, 'html.parser')

names = soup.find_all('a', href='#laySale')

names = [name.text.strip() for name in names]

print(names)

comment menu
2019.10.13. 01:05

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image

바뻐서 완전한 답변을 드리지는 못하지만 간략하게 설명하면 print를 할 때 동작 방식이 약간 차이가 있어서 그렇습니다.

 

문자열의 경우에는 str를 활용해서 출력하는 반면 리스트의 경우에는 repr를 통해서 출력을 하게 되며 이 때 각 원소들도 repr를 활용해서 출력이 되게 됩니다.

 

그래서 print('\u3000') 과 repr('\u3000')을 각각 실행해보시면 첫 번째 경우에는 공백이 출력이 되지만 두 번째의 경우에는 '\\u3000'이 출력됩니다.

 

CPython의 C로 작성된 코드를 보시면 이해가 되실 수도 있겠네요.

comment menu
2019.10.13. 15:32

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
+1

바쁘신데 댓글 달아주셔서 정말 감사합니다!

제가 C 언어를 배운지 너무 오래되어 차마 C로 작성된 코드를 볼 엄두가 나지는 않고

말씀해주신 __repr__과 __str__의 차이에 대해 구글링하여 어렴풋하게나마 이해했습니다 ^^

왜 이런 차이를 두었는지에 대해서 이해하려면 제가 아직 공부가 더 필요할 것 같은데

여튼 앞으로 스크립트를 작성할 때 이러한 부분까지 신경을 써서 작성해야겠네요~

그럼 humit 님께서도 저녁식사 맛있게 드시고 바쁘시겠지만 남은 주말 뜻깊게 보내세요!

다시 한 번 감사드립니다 :)

comment menu
2019.10.13. 17:23

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 시스템 점검 작업 완료 안내 10 마스터 24.09.05.16:25 2414
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 9431
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4883
626 가계부 프로그램 추천 부탁드립니다! 2 이니스프리 19.11.12.23:59 313
625 유튜브에 유튜버 '분류' 또는 '장르'라는 것이 존재하나요?? 2 이니스프리 19.11.12.21:57 384
624 현재 신제품 구매가 가능한 배터리 탈착식 스마트폰에 어떤 것이 있을까요? 이니스프리 19.11.10.22:18 272
623 [SSD] Micron 1100 vs Samsung 860 QVO 어떻게 생각하시는가요? 7 image 이니스프리 19.11.09.22:52 342
622 파이썬에서 requests.Session()에 대한 간단한 질문을 드립니다 ^^ 2 이니스프리 19.11.09.21:45 2033
621 리눅스에서 랜섬웨어 감염 원인이 무엇일까요? 14 NoYeah 19.11.08.17:33 335
620 명함 제작 업체 추천 부탁드립니다! 2 갱생협스 19.11.08.16:57 530
619 피규어샵 방문과 관련하여 질문 드립니다 6 이니스프리 19.11.06.21:32 311
618 싸이월드 미니홈피 크롤링 과정에서 swf 파일 다운로드와 관련하여 질문 드립니다 ㅠㅠ 6 이니스프리 19.11.05.00:45 955
617 갤럭시노트10+ 구매해도 괜찮을까요?? 2 이니스프리 19.11.03.16:03 392
616 PC 원격접속을 위한 스마트폰 앱 추천을 부탁드립니다. 14 이니스프리 19.11.02.22:21 336
615 히어로 무비 추천 부탁드립니다! 30 이니스프리 19.10.29.13:48 346
614 크롤링한 어절 또는 문장의 유사성을 구하는 방법에 대해 질문 드립니다 9 이니스프리 19.10.26.22:22 517
613 무접점 방식의 키보드의 윤활과 관련하여 질문 드려요~! 이니스프리 19.10.25.22:57 441
612 스마트폰 지문인식 과정에서 에러가 덜 발생하는 방법을 질문 드립니다 6 이니스프리 19.10.25.20:08 518
611 JS 반복 처리에 대한 로컬저장문제와 PHP의 Request의 비동기처리 2 Hanam09 19.10.20.23:10 415
610 VPS에서 홈서버의 네트워크 접속 이상 여부를 확인하는 방법이 있을까요? 6 이니스프리 19.10.15.01:26 367
609 크롤링 머신(미니PC) 세팅과 관련하여 질문 드립니다 2 이니스프리 19.10.14.20:23 574
파이썬에서 유니코드 문자열 처리와 관련하여 질문 드립니다 6 image 이니스프리 19.10.12.21:10 1299
607 유튜브 페이지 가져오는 방법이 뭐가있을까요? 9 image 슬기 19.10.11.16:52 923