2010-03-02 12 views
38

Tôi đã xem xét tất cả các xung quanh và chỉ tìm thấy giải pháp cho python 2.6 và trước đó, NOTHING về cách làm điều này trong python 3.X. (Tôi chỉ có quyền truy cập vào hộp Win7.)Làm thế nào để các thực thể HTML unescape trong một chuỗi trong Python 3.1?

Tôi CÓ thể thực hiện việc này trong 3.1 và tốt hơn là không có thư viện bên ngoài. Hiện tại, tôi đã cài đặt và truy cập httplib2 vào lệnh curl (đó là cách tôi nhận được mã nguồn cho các trang). Thật không may, curl không giải mã các thực thể html, theo như tôi biết, tôi không thể tìm thấy một lệnh để giải mã nó trong tài liệu.

CÓ, tôi đã cố gắng để có được Súp đẹp hoạt động, NHIỀU GIỜ mà không thành công trong 3.X. Nếu bạn có thể cung cấp hướng dẫn EXPLICIT về cách làm cho nó hoạt động trong python 3 trong môi trường MS Windows, tôi sẽ rất biết ơn.

Vì vậy, để rõ ràng, tôi cần phải bật các chuỗi như sau: Suzy & John thành chuỗi như sau: "Suzy & John".

Trả lời

121

Bạn có thể sử dụng chức năng html.unescape:

Trong Python3.4 + (nhờ JF Sebastian cho bản cập nhật):

import html 
html.unescape('Suzy & John') 
# 'Suzy & John' 

html.unescape('"') 
# '"' 

Trong Python3.3 trở lên:

import html.parser  
html.parser.HTMLParser().unescape('Suzy & John') 

Trong Python2:

import HTMLParser 
HTMLParser.HTMLParser().unescape('Suzy & John') 
+0

Tuyệt vời! Tuy nhiên, tôi thấy rằng chỉ unescapes ký tự nhất định. Ví dụ: dấu và ký tự vẫn được thoát. Bạn có thể giải thích tại sao điều này? Làm thế nào để tôi unescape các ký tự? –

+0

@Sho Minamimoto: Tôi đã thêm một ví dụ. Hy vọng nó giúp? – unutbu

+0

Vâng, tôi hiểu rồi, cảm ơn! –

11

Bạn có thể sử dụng xml.sax.saxutils.unescape cho mục đích này. Mô-đun này được bao gồm trong thư viện chuẩn Python, và có thể di chuyển giữa Python 2.x và Python 3.x.

>>> import xml.sax.saxutils as saxutils 
>>> saxutils.unescape("Suzy & John") 
'Suzy & John' 
+0

Dường như không đầy đủ, '& euml' không giải mã với mặc dù nó với htmlparser – bcoughlan

6

Dường như tôi không có đủ uy tín để làm bất cứ điều gì ngoài việc đăng bài này. câu trả lời của unutbu không trích dẫn unescape. Điều duy nhất tôi thấy là chức năng này

 
import re 
from htmlentitydefs import name2codepoint as n2cp 

def decodeHtmlentities(string): 
    def substitute_entity(match):   
     ent = match.group(2) 
     if match.group(1) == "#": 
      return unichr(int(ent)) 
     else: 
      cp = n2cp.get(ent) 
      if cp: 
       return unichr(cp) 
      else: 
       return match.group() 
    entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});") 
    return entity_re.subn(substitute_entity, string)[0] 

Tôi lấy từ số page này.

2

Trong trường hợp của tôi, tôi có chuỗi html được thoát trong hàm thoát as3. Sau một giờ googling đã không tìm thấy bất cứ điều gì hữu ích vì vậy tôi đã viết chức năng này recusrive để phục vụ cho nhu cầu của tôi.Dưới đây là,

def unescape(string): 
    index = string.find("%") 
    if index == -1: 
     return string 
    else: 
     #if it is escaped unicode character do different decoding 
     if string[index+1:index+2] == 'u': 
      replace_with = ("\\"+string[index+1:index+6]).decode('unicode_escape') 
      string = string.replace(string[index:index+6],replace_with) 
     else: 
      replace_with = string[index+1:index+3].decode('hex') 
      string = string.replace(string[index:index+3],replace_with) 
     return unescape(string) 

Sửa-1 gia tăng chức năng để xử lý các ký tự unicode.