ó
­V]c           @   s*  d  Z  d d g Z y d d l m Z Wn# e k
 rK Z d d l m Z n Xd d l m Z d d l	 m	 Z	 d d l
 m Z d d l m Z m Z m Z m Z m Z d d	 l m Z m Z m Z m Z m Z m Z m Z d d
 l m Z d Z d „  Z d e f d „  ƒ  YZ d e e f d „  ƒ  YZ d S(   t   MITt   LXMLTreeBuilderForXMLt   LXMLTreeBuilderiÿÿÿÿ(   t   Callable(   t   BytesIO(   t   StringIO(   t   etree(   t   Commentt   Doctypet   NamespacedAttributet   ProcessingInstructiont   XMLProcessingInstruction(   t   FASTt   HTMLt   HTMLTreeBuildert
   PERMISSIVEt   ParserRejectedMarkupt   TreeBuildert   XML(   t   EncodingDetectort   lxmlc         C   s   t  d „  |  j ƒ  Dƒ ƒ S(   s   Invert a dictionary.c         s   s!   |  ] \ } } | | f Vq d  S(   N(    (   t   .0t   kt   v(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pys	   <genexpr>&   s    (   t   dictt   items(   t   d(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   _invert$   s    c           B   s  e  Z e j Z e Z e Z d  Z	 d g Z
 e	 e e e e g Z d Z e d d ƒ Z e e ƒ Z d „  Z d „  Z d „  Z d „  Z d d d „ Z d	 „  Z d d d d
 „ Z d „  Z d „  Z i  d „ Z d „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& RS(   s   lxml-xmlt   xmli   s$   http://www.w3.org/XML/1998/namespacec         C   s*   t  t |  ƒ j | ƒ |  j |  j ƒ d S(   sX   Let the BeautifulSoup object know about the standard namespace
        mapping.
        N(   t   superR   t   initialize_soupt   _register_namespacest   DEFAULT_NSMAPS(   t   selft   soup(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR   <   s    c         C   sL   xE | j  ƒ  D]7 \ } } | r | |  j j k r | |  j j | <q q Wd S(   s¯   Let the BeautifulSoup object know about namespaces encountered
        while parsing the document.

        This might be useful later on when creating CSS selectors.
        N(   R   R"   t   _namespaces(   R!   t   mappingt   keyt   value(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR   C   s    c      	   C   s8   |  j  d  k	 r |  j  St j d |  d t d t d | ƒ S(   Nt   targett   strip_cdatat   recovert   encoding(   t   _default_parsert   NoneR   t	   XMLParsert   Falset   True(   R!   R*   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   default_parserP   s    	c         C   s@   |  j  | ƒ } t | t ƒ r< | d |  d t d | ƒ } n  | S(   NR'   R(   R*   (   R0   t
   isinstanceR   R.   (   R!   R*   t   parser(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt
   parser_forX   s    c         K   sY   | |  _  | d  k	 r' t | ƒ |  _ n  d  |  _ |  j g |  _ t t |  ƒ j	 |   d  S(   N(
   R+   R,   t   sett   empty_element_tagsR"   t   DEFAULT_NSMAPS_INVERTEDt   nsmapsR   R   t   __init__(   R!   R2   R5   t   kwargs(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR8   a   s    		c         C   s8   | d d k r* t  | d j d d ƒ ƒ Sd  | f Sd  S(   Ni    t   {i   t   }(   t   tuplet   splitR,   (   R!   t   tag(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt	   _getNsTagl   s    c   	      c   sÁ   |  j  } | r t |  _ n	 t |  _ t | t ƒ rH | d | t f Vn  t | t ƒ rt | j d ƒ d | t f Vn  | | g } t	 | | | | ƒ } x% | j
 D] } | j | | t f VqŸ Wd S(   sÓ   
        :yield: A series of 4-tuples.
         (markup, encoding, declared encoding,
          has undergone character replacement)

        Each 4-tuple represents a strategy for parsing the document.
        t   utf8N(   t   is_xmlR
   t   processing_instruction_classR   R1   t   unicodeR,   R.   t   encodeR   t	   encodingst   markup(	   R!   RF   t   user_specified_encodingt   exclude_encodingst   document_declared_encodingt   is_htmlt   try_encodingst   detectorR*   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   prepare_markupt   s    
	c         C   s  t  | t ƒ r t | ƒ } n t  | t ƒ r< t | ƒ } n  | j |  j ƒ } y‰ |  j |  j j	 ƒ |  _
 |  j
 j | ƒ xM t | ƒ d k rÈ | j |  j ƒ } t | ƒ d k r| |  j
 j | ƒ q| q| W|  j
 j ƒ  Wn1 t t t j f k
 r
} t t | ƒ ƒ ‚ n Xd  S(   Ni    (   R1   t   bytesR   RC   R   t   readt
   CHUNK_SIZER3   R"   t   original_encodingR2   t   feedt   lent   closet   UnicodeDecodeErrort   LookupErrorR   t   ParserErrorR   t   str(   R!   RF   t   datat   e(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyRR   ™   s    c         C   s   |  j  g |  _ d  S(   N(   R6   R7   (   R!   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyRT   ®   s    c         C   sŒ  t  | ƒ } d  } t | ƒ d k rL t |  j ƒ d k rL |  j j d  ƒ n} t | ƒ d k rÉ |  j | ƒ |  j j t | ƒ ƒ | j ƒ  } x9 | j ƒ  D]( \ } } t	 d | d ƒ } | | | <qš Wn  i  } xs | j ƒ  D]e \ }	 }
 |  j
 |	 ƒ \ } }	 | d  k r|
 | |	 <qÜ |  j | ƒ } t	 | |	 | ƒ }	 |
 | |	 <qÜ W| } |  j
 | ƒ \ } } |  j | ƒ } |  j j | | | | ƒ d  S(   Ni    i   t   xmlnss   http://www.w3.org/2000/xmlns/(   R   R,   RS   R7   t   appendR   R   t   copyR   R	   R?   t   _prefix_for_namespaceR"   t   handle_starttag(   R!   t   namet   attrst   nsmapt   nsprefixt   prefixt	   namespacet	   attributet	   new_attrst   attrR&   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   start±   s0    'c         C   sN   | d k r d Sx7 t |  j ƒ D]& } | d k	 r  | | k r  | | Sq  Wd S(   s9   Find the currently active prefix for the given namespace.N(   R,   t   reversedR7   (   R!   Re   t   inverted_nsmap(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR^   ß   s    c         C   sÃ   |  j  j ƒ  |  j  j d } |  j | ƒ \ } } d  } | d  k	 r‡ x@ t |  j ƒ D], } | d  k	 rT | | k rT | | } PqT qT Wn  |  j  j | | ƒ t |  j ƒ d k r¿ |  j j	 ƒ  n  d  S(   Niÿÿÿÿi   (
   R"   t   endDatat   tagStackR?   R,   Rj   R7   t   handle_endtagRS   t   pop(   R!   R`   t   completed_tagRe   Rc   Rk   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   endè   s    
c         C   s<   |  j  j ƒ  |  j  j | d | ƒ |  j  j |  j ƒ d  S(   Nt    (   R"   Rl   t   handle_dataRB   (   R!   R'   RY   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   piø   s    c         C   s   |  j  j | ƒ d  S(   N(   R"   Rs   (   R!   t   content(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyRY   ý   s    c         C   s6   |  j  j ƒ  t j | | | ƒ } |  j  j | ƒ d  S(   N(   R"   Rl   R   t   for_name_and_idst   object_was_parsed(   R!   R`   t   pubidt   systemt   doctype(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyRz      s    c         C   s1   |  j  j ƒ  |  j  j | ƒ |  j  j t ƒ d S(   s#   Handle comments as Comment objects.N(   R"   Rl   Rs   R   (   R!   Ru   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   comment  s    c         C   s   d | S(   s   See `TreeBuilder`.u)   <?xml version="1.0" encoding="utf-8"?>
%s(    (   R!   t   fragment(    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   test_fragment_to_document  s    N('   t   __name__t
   __module__R   R-   t   DEFAULT_PARSER_CLASSR/   RA   R   RB   t   NAMEt   ALTERNATE_NAMESt   LXMLR   R   R   t   featuresRP   R   R    R   R6   R   R   R0   R3   R,   R8   R?   RM   RR   RT   Ri   R^   Rq   Rt   RY   Rz   R{   R}   (    (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR   (   s8   								#		.							c           B   sT   e  Z e Z d  g Z e e e e e g Z e	 Z
 e Z d „  Z d „  Z d „  Z RS(   s	   lxml-htmlc         C   s   t  j S(   N(   R   t
   HTMLParser(   R!   R*   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR0     s    c         C   sw   |  j  j } y3 |  j | ƒ |  _ |  j j | ƒ |  j j ƒ  Wn1 t t t j	 f k
 rr } t
 t | ƒ ƒ ‚ n Xd  S(   N(   R"   RQ   R3   R2   RR   RT   RU   RV   R   RW   R   RX   (   R!   RF   R*   RZ   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyRR     s    c         C   s   d | S(   s   See `TreeBuilder`.u   <html><body>%s</body></html>(    (   R!   R|   (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR}   &  s    (   R~   R   Rƒ   R   R‚   R   R   R   R„   R.   RA   R
   RB   R0   RR   R}   (    (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyR     s   			
N(    t   __license__t   __all__t   collections.abcR   t   ImportErrorRZ   t   collectionst   ioR   R   R   R   t   bs4.elementR   R   R	   R
   R   t   bs4.builderR   R   R   R   R   R   R   t
   bs4.dammitR   Rƒ   R   R   R   (    (    (    s0   lib/python2.7/site-packages/bs4/builder/_lxml.pyt   <module>   s    	(4	è