2009-03-01 39 views
96

Điều này chắc chắn sẽ dễ dàng nhưng nó thực sự làm tôi thất vọng.In chuỗi Python dưới dạng [u'String ']

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

Tất cả văn bản tôi đang phân tích cú pháp là ASCII. Tôi biết rằng Python xử lý chuỗi như unicode, và tôi chắc chắn điều này là rất tiện dụng, chỉ là không sử dụng trong kịch bản wee của tôi.

Mỗi lần tôi in ra một biến chứa 'Chuỗi', tôi nhận được [u'String'] được in trên màn hình. Có cách nào đơn giản để có được điều này trở lại chỉ ascii hoặc tôi nên viết một regex để dải nó?

Trả lời

82

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

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

soup[0].encode("ascii") 

Tuy nhiên, xin vui lòng kiểm tra lại dữ liệu của bạn thực sự là ASCII. Điều này khá hiếm. Nhiều khả năng nó 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 gì mã hóa ban đầu là và làm cho nó trở lại trong bảng mã này:

soup[0].encode(soup.originalEncoding) 
+0

Rực rỡ. Cảm ơn. Xin lỗi vì lỗi đánh máy. – gnuchu

+6

Bạn thực sự không phải thực hiện việc mã hóa, bởi vì OP chỉ thấy chuỗi repr vì đó là cách bạn thấy bất cứ điều gì khi bạn in một danh sách.soup [0] sẽ đủ để hiển thị đường thay vì repr, hiển thị nội dung của chuỗi chứ không phải dấu ngoặc kép và công cụ sửa đổi unicode. – ironfroggy

+2

Bạn không nên mã hóa văn bản được biểu diễn 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' ... '])) '] (http://stackoverflow.com/a/36891685/4279) – jfs

1

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

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

+0

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

0

Sử dụng dir hoặc type trê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, mà in giống như một chuỗi, nhưng thực sự không phải là một. Nếu không, bên trong một danh sách và bạn cần phải chuyển đổi từng chuỗi riêng biệt.

Trong mọi trường hợp, tại sao bạn phản đối việc sử dụng Unicode? Có lý do cụ thể nào không?

+0

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ẽ nhận được u ['string'] không [u'String ']. Nhận xét của ông với Andrew Jaffe dường như chứng tỏ đó là một danh sách. – batbrat

+0

+1 về việc dạy anh ta câu cá thay vì đánh bắt cá và đưa nó cho anh ta. – batbrat

18

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

Bạn có thể chuyển đổi này vào một danh sách các chuỗi byte sử dụng bất kỳ sự thay đổi các nội dung sau:

# 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) 
+4

danh sách hiểu để giành chiến thắng – Jimmy

+1

Xin vui lòng, tránh những nỗi kinh hoàng như' repr (x) .lstrip ('u') [1: -1] '. Sử dụng một cái gì đó như: 'in '," .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

6

Nếu truy cập/in ấn danh sách phần tử duy nhất (ví dụ, tuần tự hoặc lọc):

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

nếu 'my_list = [u'String ', u'String', u'String ', u'String']' trông giống như thế này ... –

+1

bạn làm một danh sách hiểu: 'my_list = [str (my_list [x ]) cho x trong phạm vi (len (my_list))] ' – gevang

4

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

-1

encode("latin-1") giúp tôi trong trường hợp của tôi:

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

[u'String'] là một đại diện văn bản của một danh sách có chứa một 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)) tức là, để tạo ra một đại diện văn bản của một đối tượng Python với các loại list, repr() chức năng đượ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í đại diện văn bản của văn bản đại diện khác: repr(repr('a')) != repr('a').

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

Để tránh gọi repr(), bạn có thể in danh sách các mục trực tiếp (nếu họ là tất cả các chuỗi Unicode) ví dụ: print ",".join(some_list) -nó in một dấu phẩy tách ra danh sách các chuỗi: String

Đừng mã hóa một chuỗi Unicode để byte bằng cách sử dụng mã hóa ký tự được mã hóa cứng, thay vào đó, hãy trực tiếp in Unicode trực tiếp. Nếu không, mã có thể không thành công do 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 mã hóa 'ascii' với các ký tự không phải ascii. Hoặc mã âm thầm tạo ra mojibake (dữ liệu bị hỏng được chuyển tiếp trong một đường ống) nếu môi trường sử dụng một mã hóa không tương thích với mã hóa được mã hóa cứng.

3
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 trông 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 nào mà chúng ta phải lo lắng? – jrich523

-1

Có lẽ tôi không hiểu, tại sao không thể bạn chỉ nhận được những element.text và sau đó chuyển đổi nó trước khi sử dụng nó? ví dụ (không biết lý do tại sao bạn nên làm việc này nhưng ...) tìm thấy tất cả các yếu tố nhãn của trang web và lặp giữa chúng cho đến khi bạn tìm thấy một gọi 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ể im thiếu thứ gì đó trong thư gốc? hoặc là những gì bạn đang tìm kiếm?

+0

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

+0

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

+0

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 được đề xuất Ví dụ: nếu nhãn từ xa có giá trị văn bản là [u'String '] i.text sẽ là Chuỗi – Steven

Các vấn đề liên quan