파이썬 문자열은 [u'String ']으로 인쇄됩니다


142

이것은 분명히 쉬운 일이지만 실제로 나를 괴롭 힙니다.

웹 페이지를 읽고 Beautiful Soup 을 사용 하여 구문 분석 하는 스크립트가 있습니다. 로부터 수프 나의 최종 목표는 link.contents을 인쇄하는 것입니다 나는 모든 링크를 추출합니다.

구문 분석하는 모든 텍스트는 ASCII입니다. 나는 파이썬이 문자열을 유니 코드로 취급한다는 것을 알고 있으며, 이것이 내 스크립트에서 전혀 사용되지 않는 매우 편리하다고 확신합니다.

'String'을 포함하는 변수를 [u'String']인쇄 할 때마다 화면에 인쇄됩니다. 이것을 ascii로 되 돌리는 간단한 방법이 있습니까? 아니면 정규식을 작성하여 제거해야합니까?


보다 명확하게 표현 된 질문 및 답변의 가능한 복제본 : stackoverflow.com/q/2464959/1390788
Terrabits

이것이 귀하의 질문에 대답합니까? 파이썬 문자열에서 u 접두사는 무엇입니까?
Terrabits

답변:


118

[u'ABC']유니 코드 문자열의 한 요소 목록입니다. Beautiful Soup은 항상 유니 코드를 생성합니다 . 따라서 목록을 단일 유니 코드 문자열로 변환 한 다음 ASCII로 변환해야합니다.

나는 당신이 어떻게 한 원소 목록을 얻었는지에 대해 잘 모릅니다. 내용 멤버는 문자열과 태그의 목록이 될 것입니다. 당신이 정말로 항상 하나의 요소 목록을 얻을 수 있다고 가정하고 시험은 정말되는 경우에만 이을 사용 ASCII :

 soup[0].encode("ascii")

그러나 데이터가 실제로 ASCII인지 다시 확인하십시오. 이것은 매우 드 rare니다. 라틴어 또는 utf-8 일 가능성이 큽니다.

 soup[0].encode("latin-1")


 soup[0].encode("utf-8")

또는 Beautiful Soup에게 원래 인코딩이 무엇인지 물어 보고이 인코딩으로 다시 가져 오십시오.

 soup[0].encode(soup.originalEncoding)

6
OP는 문자열 repr 만 볼 수 있기 때문에 실제로 인코딩을 할 필요는 없습니다. 목록을 인쇄 할 때 아무것도 볼 수 없기 때문입니다. soup [0]은 repr 대신 str을 표시하기에 충분하며 따옴표 및 유니 코드 수정자가 아닌 문자열의 내용을 표시합니다.
ironfroggy

2
대부분의 경우 유니 코드로 표시된 텍스트를 바이트로 인코딩해서는 안됩니다. 파이썬에서 유니 코드를 직접 인쇄해야합니다.print(', '.join([u'ABC' , u'...']))
jfs

26

유니 코드 문자열이 하나 포함 된 목록이있을 수 있습니다. repr이의입니다 [u'String'].

다음을 변형하여이를 바이트 문자열 목록으로 변환 할 수 있습니다.

# Functional style.
print map(lambda x: x.encode('ascii'), my_list)

# List comprehension.
print [x.encode('ascii') for x in my_list]

# Interesting if my_list may be a tuple or a string.
print type(my_list)(x.encode('ascii') for x in my_list)

# What do I care about the brackets anyway?
print ', '.join(repr(x.encode('ascii')) for x in my_list)

# That's actually not a good way of doing it.
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list)

1
와 같은 공포를 피하십시오 repr(x).lstrip('u')[1:-1]. print ", ".join(my_list)대신 유니 코드 문자열 목록을 형식화 하려면 다음과 같이 사용하십시오 .
jfs

1
그 의견은 "실제로는 그렇게하는 것이 좋지 않다"고 말합니다. 그것은 lolz를 위해 여기에 있습니다!
ddaa

9
import json, ast
r = {u'name': u'A', u'primary_key': 1}
ast.literal_eval(json.dumps(r)) 

인쇄합니다

{'name': 'A', 'primary_key': 1}

1
이 방법은 나에게 꽤 달콤 해 보입니다. 왜 투표가 없습니까? 걱정해야 할 성능 영향은 무엇입니까?
jrich523

8

단일 요소 목록에 액세스 / 인쇄하는 경우 (예 : 순차적 또는 필터링 된) :

my_list = [u'String'] # sample element
my_list = [str(my_list[0])]

1
당신은 목록 이해를 할 :my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

출력을 str () 함수에 전달하면 유니 코드 출력 변환이 제거됩니다. 또한 출력을 인쇄하여 u ''태그를 제거합니다.


4

[u'String'] 파이썬 2에서 유니 코드 문자열을 포함하는 목록의 텍스트 표현입니다.

당신이 실행하는 경우 print(some_list)는 동일합니다 다음
print'[%s]' % ', '.join(map(repr, some_list))즉, 유형의 파이썬 객체의 텍스트 표현을 생성 list, repr()기능은 각 항목에 대해 호출됩니다.

파이썬 객체와 텍스트 표현을 혼동하지 마십시오 - repr('a') != 'a'텍스트 표현 다르다 심지어 텍스트 표현을 : repr(repr('a')) != repr('a').

repr(obj)인쇄 가능한 객체 표현이 포함 된 문자열을 반환합니다. REPL에서 디버깅에 유용 할 수있는 객체를 명확하게 표현하는 것이 목적입니다. 종종 eval(repr(obj)) == obj.

를 호출하지 않으려면 repr()목록 항목을 직접 인쇄 할 수 있습니다 (모두 유니 코드 문자열 인 경우). 예 : print ",".join(some_list)— 쉼표로 구분 된 문자열 목록을 인쇄합니다.String

하드 코드 된 문자 인코딩을 사용하여 유니 코드 문자열을 바이트로 인코딩하지 말고 대신 유니 코드를 직접 인쇄하십시오 . 그렇지 않으면 'ascii'ASCII 이외의 문자로 인코딩 을 사용하려는 경우 인코딩이 모든 문자를 표현할 수 없기 때문에 코드가 실패 할 수 있습니다 . 또는 환경에서 하드 코딩 된 인코딩과 호환되지 않는 인코딩을 사용하는 경우 코드가 자동으로 mojibake (손상된 데이터가 파이프 라인으로 전달됨)를 생성합니다.


3

사용 dir또는type '문자열'에 그것이 무엇인지 찾을 수 있습니다. 문자열처럼 인쇄되는 BeautifulSoup의 태그 객체 중 하나라고 생각하지만 실제로는 그렇지 않습니다. 그렇지 않으면 목록 안에 있으며 각 문자열을 개별적으로 변환해야합니다.

어쨌든 유니 코드 사용에 반대하는 이유는 무엇입니까? 특별한 이유가 있습니까?


지난 며칠 동안 BeautifulSoup을보고있었습니다. gnuchu가 [u'String ']이 아닌 u ['string ']을 얻는 방법을 알 수 없었습니다. Andrew Jaffe에 대한 그의 의견은 그것이 목록임을 증명하는 것 같습니다.
batbrat

3

당신은 정말로 의미 u'String'합니까?

어쨌든 str(string)유니 코드 문자열이 아닌 문자열을 얻는 것이 어떻습니까? (모든 문자열이 유니 코드 인 Python 3에서는 달라야합니다.)


나는 더 명확해야했다. str ()을 사용하고 있지만 인쇄 할 때 여전히 아래와 같이 출력됩니다. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] 데이터는 웹 페이지에서 텍스트로 제거 된 후 데이터베이스 (Google Appstore)에 삽입 된 후 검색 및 인쇄됩니다.
gnuchu


-1

어쩌면 내가 이해할 수없는 이유는 무엇입니까? element.text를 가져 와서 사용하기 전에 변환 할 수 있습니까? 예를 들어 (이 작업을 수행하는 이유를 모르지만 ...) 웹 페이지의 모든 레이블 요소를 찾고 MyText라는 요소를 찾을 때까지 반복하십시오.

        avail = []
        avail = driver.find_elements_by_class_name("label");
        for i in avail:
                if  i.text == "MyText":

i에서 문자열을 변환하고 원하는 작업을 수행하십시오. 원래 메시지에 뭔가 빠진 것이 있습니까? 또는 이것이 당신이 찾고 있던 것이 었습니까?


질문에 관한 부분이 없습니다."i에서 문자열 변환"을 수행하는 방법에 .
나단 터기

아아, 모든 의견에서 감사합니다. 문제가 변환 할 가치를 얻고 있다고 생각했습니다.
Steven

그러나 공정하게 i.text는 실제 문자열 값입니다. 예를 들어 레이블 요소의 텍스트 값이 [u'String '] i.text 인 경우 일부 사람들이 제안한 것처럼 "배열에서 꺼내기"할 필요가 없습니다. 문자열이 될 것입니다
Steven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.