Python-Ref > Mimo python > HTML > Nahrazení character entity references skutečnými znaky
 
 

<-^^->

Nahrazení character entity references skutečnými znaky

Při zpracování textu nám entity často zbytečně komplikují život a chceme je převést na znamky, které zastupují.
Character entities (znakové entity?) byly popsány zde.
Převedení číselných character entities na znaky je velice jednoduchá operace, pokud použijeme trochu pokročilejší možnosti regexpů.
Expand/Shrink
Zdroj: (html3-1.py)
  1   import re
  2   
  3   text = """In this text we u&#x73;e both hexacedimal and decimal character entitie&#115;
  4   For example this &#x2013; is a n-dash."""
  5   
  6   def convert( m):
  7     """we will use this function inside a regexp to replace entities"""
  8     hit = m.group(1)
  9     if hit.startswith( "x"):
 10       code = int( hit[1:], 16)
 11     else:
 12       code = int( hit)
 13     char = unichr( code)
 14     return char
 15   
 16   # in the code below, we supply a function to re.sub, rather than a fixed string
 17   new = re.sub( "&#(x?\d+);", convert, text)
 18   print new.encode( 'utf-8')
stdout:
In this text we use both hexacedimal and decimal character entities
For example this – is a n-dash.
Doba běhu: 81.2 ms
Převedení pojmenovaných entit je daleko náročnější problém, protože entity lze definovat v DTD dokumentu apod. Pokud nás ale budou zajímat pouze standardní HTML entity, Python má pro nás připravené řešení.
Expand/Shrink
Zdroj: (html3-2.py)
  1   import re
  2   # the following dictionary is a basis for our code
  3   from htmlentitydefs import name2codepoint
  4   
  5   text = """In this text we use known HTML entities.
  6   For example this &ndash; is a n-dash, this &mdash; is a m-dash and this &minus; is a minus.
  7   Just for comparison &ndash;&mdash;&minus;+"""
  8   
  9   def convert( m):
 10     """we will use this function inside a regexp to replace entities"""
 11     hit = m.group(1)
 12     if hit in name2codepoint:
 13       return unichr( name2codepoint[hit])
 14     else:
 15       raise ValueError( "unknown entity name '%s'"%hit)
 16   
 17   # in the code below, we supply a function to re.sub, rather than a fixed string
 18   new = re.sub( "&([a-zA-Z]+);", convert, text)
 19   print new.encode( 'utf-8')
stdout:
In this text we use known HTML entities.
For example this – is a n-dash, this — is a m-dash and this − is a minus.
Just for comparison –—−+
Doba běhu: 48.7 ms