Chuỗi Python in dưới dạng [u'String ']


142

Đây chắc chắn sẽ là một điều dễ dàng nhưng nó thực sự làm tôi khó chịu.

Tôi có một đoạn script đọc trong một trang web và sử dụng Beautiful Soup để phân tích nó. Từ súp tôi trích xuất tất cả các liên kết vì mục tiêu cuối cùng của tôi là in ra các link.contents.

Tất cả các văn bản mà tôi đang phân tích cú pháp là ASCII. Tôi biết rằng Python coi các chuỗi là unicode và tôi chắc chắn rằng điều này rất tiện dụng, chỉ là không có ích gì trong tập lệnh nhỏ của tôi.

Mỗi lần tôi đi in ra một biến chứa 'Chuỗi' tôi sẽ được [u'String']in ra màn hình. Có một cách đơn giản để đưa nó trở lại chỉ là ascii hay tôi nên viết một biểu thức chính thức để loại bỏ nó?


có thể trùng lặp với câu hỏi (và câu trả lời) rõ ràng hơn nhiều: stackoverflow.com/q/2464959/1390788
Terrabits

Điều này có trả lời câu hỏi của bạn không? Tiền tố u trong chuỗi Python là gì?
Khủng bố

Câu trả lời:


118

[u'ABC']sẽ là một danh sách một phần tử của chuỗi unicode. Soup đẹp luôn tạo ra Unicode . Vì vậy, bạn cần chuyển đổi danh sách thành một chuỗi unicode duy nhất, sau đó chuyển đổi danh sách đó thành ASCII.

Tôi không biết rõ làm thế nào bạn có được danh sách một yếu tố; thành viên nội dung sẽ là một danh sách các chuỗi và thẻ, dường như không phải là những gì bạn có. Giả sử rằng bạn thực sự luôn nhận được một danh sách với một yếu tố duy nhất và bài kiểm tra của bạn thực sự chỉ là ASCII, bạn sẽ sử dụng điều này:

 soup[0].encode("ascii")

Tuy nhiên, vui lòng kiểm tra kỹ xem dữ liệu của bạn có thực sự là ASCII không. Điều này là khá hiếm. Nhiều khả năng đó là latin-1 hoặc utf-8.

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


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

Hoặc bạn hỏi Beautiful Soup mã hóa ban đầu là gì và lấy lại mã hóa này:

 soup[0].encode(soup.originalEncoding)

6
Bạn thực sự không phải thực hiện mã hóa, vì OP chỉ nhìn thấy chuỗi repr bởi vì đó là cách bạn nhìn thấy bất cứ điều gì khi bạn in một danh sách. súp [0] sẽ đủ để hiển thị str thay vì repr, hiển thị nội dung của chuỗi và không phải là trích dẫn và sửa đổi unicode.
ironfroggy

2
Bạn không nên mã hóa văn bản được biểu thị dưới dạng Unicode thành byte trong hầu hết các trường hợp: bạn nên in Unicode trực tiếp bằng Python:print(', '.join([u'ABC' , u'...']))
jfs

26

Bạn có thể có một danh sách chứa một chuỗi unicode. Các reprđiều này là [u'String'].

Bạn có thể chuyển đổi danh sách này thành một danh sách các chuỗi byte bằng cách sử dụng bất kỳ biến thể nào sau đây:

# 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
Xin vui lòng, tránh những điều kinh khủng như repr(x).lstrip('u')[1:-1]. Sử dụng một cái gì đó như: print ", ".join(my_list)thay vào đó, để định dạng một danh sách các chuỗi Unicode.
jfs

1
Nhận xét, nó nói: "Đó thực sự không phải là một cách tốt để làm điều đó". Nó chỉ ở đây cho lolz!
ddaa

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

sẽ in

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

1
Phương pháp này có vẻ khá ngọt ngào với tôi, tại sao không có phiếu bầu? bất kỳ tác động hiệu suất chúng ta nên lo lắng về?
jrich523

8

Nếu truy cập / in danh sách thành phần đơn (ví dụ: tuần tự hoặc được lọc):

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

1
bạn làm một danh sách hiểu:my_list = [str(my_list[x]) for x in range(len(my_list))]
gevang

4

truyền hàm đầu ra cho hàm str () và nó sẽ loại bỏ chuyển đổi đầu ra unicode. cũng bằng cách in đầu ra, nó sẽ xóa các thẻ u '' khỏi nó.


4

[u'String'] là biểu diễn văn bản của danh sách chứa chuỗi Unicode trên Python 2.

Nếu bạn chạy print(some_list)thì nó tương đương với
print'[%s]' % ', '.join(map(repr, some_list))nghĩa là, để tạo một biểu diễn văn bản của một đối tượng Python với kiểu list, repr()hàm được gọi cho mỗi mục.

Đừng nhầm lẫn một đối tượng Python và biểu diễn văn bản của nó - repr('a') != 'a'và thậm chí biểu diễn văn bản của biểu diễn văn bản khác nhau : repr(repr('a')) != repr('a').

repr(obj)trả về một chuỗi chứa một đại diện có thể in của một đối tượng. Mục đích của nó là đại diện rõ ràng cho một đối tượng có thể hữu ích để gỡ lỗi, trong REPL. Thường xuyên eval(repr(obj)) == obj.

Để tránh gọi điện repr(), bạn có thể in các mục danh sách trực tiếp (nếu chúng là tất cả các chuỗi Unicode), vd: xuất hiện print ",".join(some_list)một danh sách các chuỗi được phân tách bằng dấu phẩy:String

Không mã hóa chuỗi Unicode thành byte bằng mã hóa ký tự được mã hóa cứng, thay vào đó hãy in Unicode trực tiếp . Mặt khác, mã có thể thất bại vì mã hóa không thể đại diện cho tất cả các ký tự, ví dụ: nếu bạn cố gắng sử dụng 'ascii'mã hóa với các ký tự không phải mã ascii. Hoặc mã âm thầm tạo ra mojibake (dữ liệu bị hỏng được truyền thêm trong đường ống) nếu môi trường sử dụng mã hóa không tương thích với mã hóa được mã hóa cứng.


3

Sử dụng dirhoặc typetrên 'chuỗi' để tìm hiểu nó là gì. Tôi nghi ngờ rằng đó là một trong những đối tượng thẻ của BeautifulSoup, nó in như một chuỗi, nhưng thực sự không phải là một đối tượng. Mặt khác, nó nằm trong danh sách và bạn cần chuyển đổi từng chuỗi riêng biệt.

Trong mọi trường hợp, tại sao bạn lại phản đối việc sử dụng Unicode? Bất kỳ lý do cụ thể?


Tôi đã xem BeautifulSoup từ vài ngày trước. Tôi không thể hiểu làm thế nào gnuchu sẽ có được u ['chuỗi'] chứ không phải [u'String ']. Nhận xét của ông cho Andrew Jaffe dường như chứng minh nó là một danh sách.
batbrat

3

Bạn có thực sự có ý nghĩa u'String'?

Trong mọi trường hợp, bạn không thể làm gì str(string)để có được một chuỗi chứ không phải là một chuỗi unicode? (Điều này sẽ khác với Python 3, trong đó tất cả các chuỗi là unicode.)


Tôi nên rõ ràng hơn. Tôi đang sử dụng str () nhưng vẫn nhận được đầu ra như bên dưới khi tôi in. [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] Dữ liệu được xóa dưới dạng văn bản từ một trang web, sau đó chèn vào cơ sở dữ liệu (Google Appstore), sau đó lấy ra và in.
gnuchu


-1

Có lẽ tôi không hiểu, tại sao bạn không thể lấy phần tử.text và sau đó chuyển đổi nó trước khi sử dụng nó? chẳng hạn (không biết tại sao bạn lại làm điều này nhưng ...) tìm tất cả các thành phần nhãn của trang web và lặp lại giữa chúng cho đến khi bạn tìm thấy một tên gọi là MyText

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

Chuyển đổi chuỗi từ i và làm bất cứ điều gì bạn muốn làm ... có thể tôi đang thiếu một cái gì đó trong thông điệp ban đầu? hoặc đây là những gì bạn đang tìm kiếm?


Bạn đang thiếu phần câu hỏi về cách thực hiện "Chuyển đổi chuỗi từ i".
Nathan Tuggy

ahhh, cảm ơn từ tất cả các ý kiến ​​tôi nghĩ rằng vấn đề đã nhận được giá trị để chuyển đổi
Steven

nhưng để công bằng, i.text là giá trị chuỗi thực tế, không cần phải "kéo nó ra khỏi một mảng" như một số người đề xuất nếu ví dụ nhãn el có giá trị văn bản là [u'String '] i.text sẽ là Chuỗi
Steven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.