สตริง Python พิมพ์เป็น [u'String ']


142

สิ่งนี้จะเป็นสิ่งที่ง่าย แต่ก็เป็นสิ่งที่หลอกลวงฉันจริงๆ

ฉันมีสคริปต์ที่อ่านในหน้าเว็บและใช้Beautiful Soupเพื่อแยกวิเคราะห์ จากซุปฉันแยกลิงค์ทั้งหมดเป็นเป้าหมายสุดท้ายของฉันคือพิมพ์ลิงค์เนื้อหา

ข้อความทั้งหมดที่ฉันกำลังวิเคราะห์คือ ASCII ฉันรู้ว่า Python ปฏิบัติกับสตริงเป็นยูนิโค้ดและฉันมั่นใจว่านี่เป็นประโยชน์อย่างมากโดยไม่ต้องใช้ในสคริปต์ของฉัน

ทุกครั้งที่ฉันไปพิมพ์ตัวแปรที่มี 'String' ฉันจะ[u'String']พิมพ์ไปที่หน้าจอ มีวิธีง่ายๆในการทำให้มันกลับมาเป็นเพียง ascii หรือฉันควรเขียน regex เพื่อดึงมัน?


เป็นไปได้ที่ซ้ำกันของคำถามที่ชัดเจนยิ่งขึ้น (และคำตอบ): stackoverflow.com/q/2464959/1390788
Terrabits

สิ่งนี้ตอบคำถามของคุณหรือไม่ คำนำหน้าคุณในสตริง Python คืออะไร
Terrabits

คำตอบ:


118

[u'ABC']จะเป็นรายการองค์ประกอบหนึ่งของสตริง Unicode ซุปที่สวยงามจะผลิต Unicodeเสมอ ดังนั้นคุณต้องแปลงรายการเป็นสตริงยูนิโค้ดเดียวแล้วแปลงเป็น ASCII

ฉันไม่รู้ว่าคุณมีรายการองค์ประกอบเดียวอย่างไร สมาชิกเนื้อหาจะเป็นรายการของสตริงและแท็กซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณมี สมมติว่าคุณได้รับรายการที่มีองค์ประกอบเดียวเสมอและการทดสอบของคุณเป็นเพียง ASCII จริงๆคุณจะใช้สิ่งนี้:

 soup[0].encode("ascii")

อย่างไรก็ตามโปรดตรวจสอบอีกครั้งว่าข้อมูลของคุณเป็น ASCII จริงๆ มันค่อนข้างหายาก มีโอกาสมากขึ้นที่จะเป็น latin-1 หรือ utf-8

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


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

หรือคุณถาม Beautiful Soup ว่าการเข้ารหัสดั้งเดิมคืออะไรและนำกลับมาใช้ในการเข้ารหัสนี้:

 soup[0].encode(soup.originalEncoding)

6
คุณไม่จำเป็นต้องทำการเข้ารหัสเพราะ OP จะเห็นข้อความที่พิมพ์ซ้ำเท่านั้นเพราะนั่นคือสิ่งที่คุณเห็นเมื่อคุณพิมพ์รายการ soup [0] จะเพียงพอที่จะแสดง str แทนที่จะเป็น repr แสดงเนื้อหาของสตริงไม่ใช่ตัวอ้างอิงอัญประกาศและ unicode
ironfroggy

2
คุณไม่ควรเข้ารหัสข้อความที่แสดงเป็น Unicode เป็นไบต์ในกรณีส่วนใหญ่: คุณควรพิมพ์ Unicode โดยตรงใน Python: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)แทนเพื่อจัดรูปแบบรายการของสตริง Unicode
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 () และมันจะลบการแปลงเอาท์พุท Unicode ด้วยการพิมพ์ผลลัพธ์มันจะลบแท็ก u '' ออกจากมัน


4

[u'String'] เป็นการแสดงข้อความของรายการที่มีสตริง Unicode บน Python 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()คุณสามารถพิมพ์รายการในรายการได้โดยตรง (หากเป็นสตริง Unicode ทั้งหมด) เช่น: print ",".join(some_list)- พิมพ์รายการสตริงที่คั่นด้วยเครื่องหมายจุลภาค:String

อย่าเข้ารหัสสตริง Unicode เป็นไบต์โดยใช้การเข้ารหัสอักขระแบบฮาร์ดโค้ดพิมพ์ Unicode โดยตรงแทน มิฉะนั้นรหัสอาจล้มเหลวเนื่องจากการเข้ารหัสไม่สามารถแสดงอักขระทั้งหมดเช่นหากคุณพยายามใช้การ'ascii'เข้ารหัสด้วยอักขระที่ไม่ใช่ ASCII หรือโค้ดเงียบสร้าง mojibake (ข้อมูลที่เสียหายจะถูกส่งต่อไปในไพพ์ไลน์) หากสภาพแวดล้อมนั้นใช้การเข้ารหัสที่ไม่สามารถใช้ร่วมกับการเข้ารหัสแบบฮาร์ดโค้ดได้


3

ใช้dirหรือtype'สตริง' เพื่อค้นหาว่ามันคืออะไร ฉันสงสัยว่ามันเป็นหนึ่งในวัตถุแท็กของ BeautifulSoup ที่พิมพ์เหมือนสตริง แต่จริงๆแล้วไม่ใช่ มิฉะนั้นจะอยู่ในรายการและคุณต้องแปลงแต่ละสตริงแยกกัน

ไม่ว่าในกรณีใดเหตุใดคุณจึงคัดค้านการใช้ Unicode มีเหตุผลเฉพาะเจาะจงหรือไม่


ฉันดู BeautifulSoup ตั้งแต่สองสามวันที่ผ่านมา ฉันไม่สามารถทราบได้ว่า gnuchu จะได้รับ u ['string'] ไม่ใช่ [u'String '] ได้อย่างไร ความคิดเห็นของเขาที่มีต่อ Andrew Jaffe ดูเหมือนจะพิสูจน์ว่าเป็นรายการ
batbrat

3

คุณหมายถึงจริงu'String'เหรอ?

ไม่ว่าในกรณีใดคุณไม่สามารถทำได้แค่str(string)รับสตริงแทนที่จะเป็นยูนิโค้ดสตริง? (สิ่งนี้ควรแตกต่างกันไปสำหรับ Python 3 ซึ่งสตริงทั้งหมดเป็น Unicode)


ฉันควรชัดเจนกว่านี้ ฉันกำลังใช้ 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"
นาธาน Tuggy

อ่าขอบคุณจากความคิดเห็นทั้งหมดที่ฉันคิดว่าปัญหาได้รับการแปลงค่า
Steven

แต่เพื่อความยุติธรรม i.text คือค่าสตริงที่แท้จริงไม่จำเป็นต้อง "ดึงมันออกมาจากอาร์เรย์" เหมือนบางคนแนะนำว่าถ้า elemet label เช่นมีค่าข้อความ [u'String '] i.text จะเป็น String
Steven
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.