
    m*i              	          S SK Jr  S SKJr  S SKJrJr  S SKrS SKJ	r	  S SK
r
S SKrS SKJr  S SKrS SKrS SKJr  S SKJs  Jr  S SKrS SKJrJrJrJrJrJrJrJ r J!r!  S SK"J#r$  S S	K%J&r&  \RN                  " / S
QS9S 5       r(S r)S r*S r+S r,\RN                  " \RZ                  " S\R\                  " S5      \R\                  " S5      /S9\RZ                  " S\R\                  " S5      S9/S9S 5       r/ " S S5      r0g)    )Iterator)partial)BytesIOStringION)Path)URLError)is_platform_windows)	NA	DataFrame
MultiIndexSeries	Timestamp
date_rangeread_csv	read_htmlto_datetime)file_path_to_url)zchinese_utf-16.htmlzchinese_utf-32.htmlzchinese_utf-8.htmlzletz_latin1.html)paramsc                 ,    U" SSSU R                   5      $ )z6Parametrized fixture for HTML encoding test filenames.iodatahtml_encoding)param)requestdatapaths     Y/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/pandas/tests/io/test_html.pyhtml_encoding_filer   $   s     D&/7==AA    c                 L   [        U 5      [        U5      :X  d   S[        U 5       S[        U5       35       eSn[        [        S U U5      5      nU(       d   U5       e[        X5       H7  u  pg[        R
                  " Xg/UQ70 UD6  UR                  (       d  M2   S5       e   g )Nz*lists are not of equal size len(list1) == z, len(list2) == z$not all list elements are DataFramesc                 P    [        U [        5      =(       a    [        U[        5      $ N
isinstancer   )xys     r   <lambda>(assert_framelist_equal.<locals>.<lambda>:   s    Ay1NjI6NNr   zframes are both empty)lenallmapziptmassert_frame_equalempty)list1list2argskwargsmsgboth_framesframe_iframe_js           r   assert_framelist_equalr7   1   s    u:U# 	U %U	&#
 1CN	
K ;-
g@@@===9"99  .r   c           	         [         R                  " S5      n[         R                  " S5        U R                  USS5        [         R                  " [        SS9   [        U" SSS	S
5      SS9  S S S 5        g ! , (       d  f       g = f)Nbs4html5lib__version__z4.2zPandas requires versionmatchr   r   html	spam.htmlflavor)pytestimportorskipsetattrraisesImportErrorr   )monkeypatchr   r9   s      r   test_bs4_version_failsrH   E   sc    


e
$C

#]E2	{*C	D(4=eL 
E	D	Ds   A66
Bc                      Sn SnSU-   S-   n[         R                  " [        US9   [        [	        U 5      SUS9  S S S 5        g ! , (       d  f       g = f)Nz
google.comzinvalid flavorz\{z \} is not a valid set of flavorsr<   googler=   rA   )rB   rE   
ValueErrorr   r   )urlrA   r3   s      r   test_invalid_flavorrN   N   sE    
CF
&.>
>C	z	-(3-x? 
.	-	-s   A
Ac                     [         R                  " S5        [         R                  " S5        [         R                  " S5        U " SSSS5      n[        USS/S	9n[        USS/S	9n[        X#5        g )
Nr9   lxmlr:   r   r   r>   valid_markup.htmlr   )	index_colrA   )rB   rC   r   r7   )r   filenamedfs_lxmldfs_bs4s       r   test_same_orderingrV   W   se    



#ff.ABHQx@HAug>G8-r   r9   r:   )marksrP   c                 2    [        [        U R                  S9$ )Nr@   )r   r   r   )r   s    r   flavor_read_htmlrY   b   s     9W]]33r   c            	       	   \ rS rSrS r\R                  S 5       r\R                  S 5       rS r	S r
\R                  R                  \R                  R                  S 5       5       r\R                  R                  \R                  R                  S 5       5       r\R                  R                   S	 5       rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%\R                  R                  \R                  R                  S 5       5       r&\R                  R                   \R                  R                  \R                  R                  S 5       5       5       r'\R                  R                   S  5       r(\R                  R                   S! 5       r)\R                  R                   S" 5       r*\R                  R                   S# 5       r+\R                  R                   S$ 5       r,\R                  R                   S% 5       r-\R                  R                   S& 5       r.\R                  R                   S' 5       r/\R                  R                   S( 5       r0S) r1\R                  S* 5       r2\R                  R                  \R                  R                  S+ 5       5       r3\R                  R                  \R                  R                  S, 5       5       r4S- r5S. r6S/ r7S0 r8S1 r9S2 r:\R                  R                   S3 5       r;\R                  R                   S4 5       r<S5 r=S6 r>S7 r?S8 r@S9 rAS: rBS; rCS< rDS= rES> rFS? rGS@ rHSA rI\R                  R                  SBSCSD/5      SE 5       rKSF rLSG rMSH rNSI rOSJ rPSK rQSL rR\R                  R                   SM 5       rSSN rTSO rU\R                  R                  SPSC\V" SQ/5      SR4SD\V" SS/5      \V" SQ/5      4/5      ST 5       rW\R                  R                  SUSCSD/5      SV 5       rX\YR                  " 5       \R                  R                  SW5      SX 5       5       r\SY r]SZ r^\R                  R                   \R                  R                  S[ 5       5       r_S\ r`S] ra\R                  R                  SB/ S^Q5      S_ 5       rbS` rcSa rdSb reSc rfSdrggR)eTestReadHtmll   c                 ~    Sn[         R                  " [        US9   U" S5        S S S 5        g ! , (       d  f       g = f)NzPassing literal html to 'read_html' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.r<   a  <table>
                <thead>
                    <tr>
                        <th>A</th>
                        <th>B</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                    </tr>
                </tbody>
                <tbody>
                    <tr>
                        <td>3</td>
                        <td>4</td>
                    </tr>
                </tbody>
            </table>)r,   assert_produces_warningFutureWarning)selfrY   r3   s      r   test_literal_html_deprecation*TestReadHtml.test_literal_html_deprecationm   s8    > 	 ''SA BAA   	.
<c                     U" SSSS5      $ )Nr   r   r>   r?    r`   r   s     r   	spam_dataTestReadHtml.spam_data   s    ffk::r   c                     U" SSSS5      $ )Nr   r   r>   banklist.htmlre   rf   s     r   banklist_dataTestReadHtml.banklist_data   s    ffo>>r   c                 z   [        [        R                  R                  S5      R                  S5      [        R
                  " [        S5      5      S9R                  SR                  5      R                  [        5      nUR                  5       nU" [        U5      SS0SS	9S   n[        R                  " XB5        g )
N   )      abccolumnsz{:.3f}class	dataframer   )attrsrR   )r   nprandomdefault_rngpdIndexlistr*   formatastypefloatto_htmlr   r,   r-   )r`   rY   dfoutress        r   test_to_html_compat TestReadHtml.test_to_html_compat   s    		%%a(//7e-
 S!&&- 	 jjlSM';!71

 	c&r   c                    [        [        S[        R                  S/SS9[        / SQSS9[        S[        R                  S/SS9[        / S	QSS9/ S
Q/ SQ/ SQ/ SQS.5      nUR	                  SS9n[
        R                  " SU5         U" [        U5      US9S   nS S S 5        US:X  a;  [        R                  " S5      n[
        R                  " UR                  5       5      nO[
        R                  " U5      n[        [        S[        R                  S/SS9[        / SQSS9[        S[        R                  S/SS9[        / S	QSS9[        SS[        /SS9[        / SQSS9[        / SQUS9[        / SQUS9S.5      n	US:X  aF  SS KnSSKJn
  [        U	R"                   Vs0 s H  nX" UR%                  X   SS95      _M     sn5      n	[&        R(                  " WU	SS9  g ! , (       d  f       GNP= fs  snf )N   rp   Int64)dtype)r   rn   rp         ?      @Float64)r   g       @r   )TFN)TFTabc)r   r   N)r   r   r   defghFindexzmode.string_storagedtype_backendr   pyarrowTboolean)ArrowExtensionArray)from_pandas)check_column_type)r   r   rw   nanr   rz   option_contextr   rB   rC   
ArrowDtypestringStringDtyper
   r   pandas.arraysr   rs   arrayr,   r-   )r`   string_storager   rY   r   r   resultpastring_dtypeexpectedr   cols               r   test_dtype_backendTestReadHtml.test_dtype_backend   s   QN':IW5S"&&#.i@O9=(($%	
 jjuj%4nE%hsm=QRSTF F I%$$Y/B==5L>>.9LQN':IW5S"&&#.i@O9=T5"-Y?/yAO<@,LA	
 I% 9   (/// ,RXXhmQUX-VWW/H 	fh%HI FE8s   	G&&"G8&
G5c                     [        USS9 nUR                  UR                  5       S9  U" UR                  SS9nU" UR                  SS9nS S S 5        [	        WW5        g ! , (       d  f       N= f)Nutf-8encodingcontentFirst Federal Bank of Floridar<   Metcalf Bankopenserve_contentreadrM   r7   )r`   
httpserverrk   rY   r   df1df2s          r   test_banklist_urlTestReadHtml.test_banklist_url   sk     -'2a$$QVVX$6"5C #$C 3 	sC( 32   A A  
A.c                     [        USS9 nUR                  UR                  5       S9  U" UR                  SS9nU" UR                  SS9nS S S 5        [	        WW5        g ! , (       d  f       N= f)Nr   r   r   	.*Water.*r<   Unitr   )r`   r   rg   rY   r   r   r   s          r   test_spam_urlTestReadHtml.test_spam_url   sa     )g.!$$QVVX$6":>>EC":>>@C /
 	sC( /.r   c                 B    U" USSS0S9nU" USSS0S9n[        X45        g )Nz.*Florida.*idtabler=   rv   r   r7   )r`   rk   rY   r   r   s        r   test_banklistTestReadHtml.test_banklist   s8    tWo
 g
 	s(r   c                     U" USS9nU" USS9n[        X45        US   R                  S   S:X  d   eUS   R                  S   S:X  d   eg )Nr   r<   r   r   r   r   
ProximatesNutrient)r7   ilocrs   r`   rg   rY   r   r   s        r   	test_spamTestReadHtml.test_spam  sX    y<y7s(1v{{4 L0001v~~a J...r   c                 T    U" U5      nU H  n[        U[        5      (       a  M   e   g r!   r"   )r`   rg   rY   dfsr   s        r   test_spam_no_matchTestReadHtml.test_spam_no_match	  s)    y)Bb),,,, r   c                 V    U" USS0S9nU H  n[        U[        5      (       a  M   e   g )Nr   r   )rv   r"   )r`   rk   rY   r   r   s        r   test_banklist_no_match#TestReadHtml.test_banklist_no_match  s/    }T7ODBb),,,, r   c                 j    U" USSS9S   nUR                   S   S:X  d   eUR                  (       a   eg )Nr   rn   r=   headerr   r   )rs   r.   )r`   rg   rY   r   s       r   test_spam_headerTestReadHtml.test_spam_header  s9    i{1EaHzz!},,,88|8r   c                 :    U" USSS9nU" USSS9n[        X45        g Nr   r   r=   skiprowsr   r   r   s        r   test_skiprows_intTestReadHtml.test_skiprows_int  &    yaHyCs(r   c                 ^    U" US[        S5      S9nU" US[        S5      S9n[        X45        g Nr   rn   r   r   )ranger7   r   s        r   test_skiprows_range TestReadHtml.test_skiprows_range  .    yeAhOyqJs(r   c                 B    U" USSS/S9nU" USSS/S9n[        X45        g Nr   r   rn   r   r   r   r   s        r   test_skiprows_listTestReadHtml.test_skiprows_list$  .    yq!fMy!QHs(r   c                 B    U" USSS1S9nU" USSS1S9n[        X45        g r   r   r   s        r   test_skiprows_setTestReadHtml.test_skiprows_set*  r   r   c                 :    U" USSS9nU" USSS9n[        X45        g r   r   r   s        r   test_skiprows_slice TestReadHtml.test_skiprows_slice0  r   r   c                 ^    U" US[        S5      S9nU" US[        S5      S9n[        X45        g r   slicer7   r   s        r   test_skiprows_slice_short&TestReadHtml.test_skiprows_slice_short6  r   r   c           	      d    U" US[        SS5      S9nU" US[        SSS5      S9n[        X45        g )	Nr   rn      r   r   ro   r   r   r   s        r   test_skiprows_slice_long%TestReadHtml.test_skiprows_slice_long<  s4    yeAqkRyq!RQs(r   c                     U" US[         R                  " S5      S9nU" US[         R                  " S5      S9n[        X45        g r   )rw   aranger7   r   s        r   test_skiprows_ndarray"TestReadHtml.test_skiprows_ndarrayB  s7    ybiiPQlSy1Ns(r   c                 z    [         R                  " [        SS9   U" USSS9  S S S 5        g ! , (       d  f       g = f)Nz%is not a valid type for skipping rowsr<   r   asdfr   )rB   rE   	TypeError)r`   rg   rY   s      r   test_skiprows_invalid"TestReadHtml.test_skiprows_invalidH  s*    ]]9-TVYkFK WVVs   	,
:c                 :    U" USSS9nU" USSS9n[        X45        g Nr   r   r=   rR   r   r   r   s        r   
test_indexTestReadHtml.test_indexL  s&    yqIy!Ds(r   c                 >    U" USSSS9nU" USSSS9n[        X45        g Nr   r   r   )r=   r   rR   r   r   r   s        r   test_header_and_index_no_types+TestReadHtml.test_header_and_index_no_typesQ  +    yAQRSyqANs(r   c                 >    U" USSSS9nU" USSSS9n[        X45        g r  r   r   s        r    test_header_and_index_with_types-TestReadHtml.test_header_and_index_with_typesV  r  r   c                 :    U" USSS9nU" USSS9n[        X45        g r  r   r   s        r   test_infer_typesTestReadHtml.test_infer_types[  s&    yqIy!Ds(r   c                 *   [        USS9 n[        UR                  5       5      nS S S 5        [        USS9 n[        UR                  5       5      nS S S 5        U" WSS9nU" WSS9n[        Xg5        g ! , (       d  f       NT= f! , (       d  f       N9= fNzUTF-8r   r   r<   r   )r   r   r   r7   )r`   rg   rY   r   data1data2r   r   s           r   test_string_ioTestReadHtml.test_string_ioa  sz    )g.!QVVX&E / )g.!QVVX&E / uK8uF3s( /. /.s   A3B3
B
Bc                     [        USS9 nUR                  5       nS S S 5        U" [        W5      SS9nU" [        U5      SS9n[        XV5        g ! , (       d  f       N:= fr  )r   r   r   r7   )r`   rg   rY   r   r   r   r   s          r   test_stringTestReadHtml.test_stringl  sQ    )g.!668D / x~[Ax~V<s( /.s   A
Ac                     [        USS9 nU" USS9nS S S 5        [        USS9 nU" USS9nS S S 5        [        WW5        g ! , (       d  f       N5= f! , (       d  f       N,= fr  )r   r7   )r`   rg   rY   r   r   r   s         r   test_file_likeTestReadHtml.test_file_likeu  s\    )g.!"1K8C / )g.!"1F3C / 	sC( /. /.s   AA
A
A!c                     UR                  SSS9  [        R                  " [        SS9   U" SSS9  S S S 5        g ! , (       d  f       g = f)Nz#urlopen error unknown url type: git  coder<   zgit://github.comr   )r   rB   rE   r   r`   r   rY   s      r   test_bad_url_protocol"TestReadHtml.test_bad_url_protocol~  s?     	  !FS Q]]8+PQ/{C RQQs	   ;
A	c                     UR                  SSS9  [        R                  " [        [        4SS9   U" UR
                  SS9  S S S 5        g ! , (       d  f       g = f)NzName or service not knownr(  r)  zHTTP Error 404: NOT FOUNDr<   r   )r   rB   rE   r   rL   rM   r+  s      r   test_invalid_urlTestReadHtml.test_invalid_url  sG     	  !<3 G]]Hj19TUZ^^;? VUUs   A
Ac                     UnU" [        [        R                  R                  U5      5      SSS0S9n[	        U[
        5      (       d   eU H  n[	        U[        5      (       a  M   e   g )NFirstr   r   r   )r   ospathabspathr#   r|   r   r`   rk   rY   rM   r   r   s         r   test_file_urlTestReadHtml.test_file_url  sa    RWW__S12'$PW
 #t$$$$Bb),,,, r   c                     Un[         R                  " [        SS9   U" USSS0S9  S S S 5        g ! , (       d  f       g = f)NzNo tables foundr<   r   r   	tasdfabler   rB   rE   rL   )r`   rk   rY   rM   s       r   test_invalid_table_attrs%TestReadHtml.test_invalid_table_attrs  s8    ]]:->?:4BU @??   0
>c                 f    U" USSS0SS/S9S   n[        UR                  [        5      (       d   eg )NMetcalfr   r   r   r   )r=   rv   r   r#   rs   r   r`   rk   rY   r   s       r   test_multiindex_header#TestReadHtml.test_multiindex_header  s>    4/1a&

 "**j1111r   c                 f    U" USSS0SS/S9S   n[        UR                  [        5      (       d   eg )Nr@  r   r   r   r   )r=   rv   rR   )r#   r   r   rB  s       r   test_multiindex_index"TestReadHtml.test_multiindex_index  s?    4/aQRV

 "((J////r   c                     U" USSS0SS/SS/S9S   n[        UR                  [        5      (       d   e[        UR                  [        5      (       d   eg )Nr@  r   r   r   r   )r=   rv   r   rR   )r#   rs   r   r   rB  s       r   test_multiindex_header_index)TestReadHtml.test_multiindex_header_index  sa    /q6!f
  "**j1111"((J////r   c                 h    U" USSS0SS/SS9S   n[        UR                  [        5      (       d   eg Nr@  r   r   r   r   )r=   rv   r   r   rA  rB  s       r   &test_multiindex_header_skiprows_tuples3TestReadHtml.test_multiindex_header_skiprows_tuples  F    /q6
  "**j1111r   c                 h    U" USSS0SS/SS9S   n[        UR                  [        5      (       d   eg rL  rA  rB  s       r   test_multiindex_header_skiprows,TestReadHtml.test_multiindex_header_skiprows  rO  r   c           	          U" USSS0SS/SS/SS9S   n[        UR                  [        5      (       d   e[        UR                  [        5      (       d   eg )Nr@  r   r   r   r   )r=   rv   r   rR   r   )r#   r   r   rs   rB  s       r   %test_multiindex_header_index_skiprows2TestReadHtml.test_multiindex_header_index_skiprows  sd    /q6!f
  "((J////"**j1111r   c                 &   UnU" [        [        R                  R                  U5      5      [        R
                  " [        R
                  " S5      5      SS0S9n[        U[        5      (       d   eU H  n[        U[        5      (       a  M   e   g )NFloridar   r   r   )	r   r3  r4  r5  recompiler#   r|   r   r6  s         r   test_regex_idempotency#TestReadHtml.test_regex_idempotency  st    RWW__S12**RZZ	23/

 #t$$$$Bb),,,, r   c                 ~    Sn[         R                  " [        US9   U" USSS9  S S S 5        g ! , (       d  f       g = f)Nz\(you passed a negative value\)r<   Waterr   r   r;  )r`   rg   rY   r3   s       r   test_negative_skiprows#TestReadHtml.test_negative_skiprows  s-    0]]:S1YgC 211rc   c                     g)Naf  
          <table class="contentstable" align="center"><tr>
            <td width="50%">
            <p class="biglink"><a class="biglink" href="whatsnew/2.7.html">What's new in Python 2.7?</a><br/>
                <span class="linkdescr">or <a href="whatsnew/index.html">all "What's new" documents</a> since 2.0</span></p>
            <p class="biglink"><a class="biglink" href="tutorial/index.html">Tutorial</a><br/>
                <span class="linkdescr">start here</span></p>
            <p class="biglink"><a class="biglink" href="library/index.html">Library Reference</a><br/>
                <span class="linkdescr">keep this under your pillow</span></p>
            <p class="biglink"><a class="biglink" href="reference/index.html">Language Reference</a><br/>
                <span class="linkdescr">describes syntax and language elements</span></p>
            <p class="biglink"><a class="biglink" href="using/index.html">Python Setup and Usage</a><br/>
                <span class="linkdescr">how to use Python on different platforms</span></p>
            <p class="biglink"><a class="biglink" href="howto/index.html">Python HOWTOs</a><br/>
                <span class="linkdescr">in-depth documents on specific topics</span></p>
            </td><td width="50%">
            <p class="biglink"><a class="biglink" href="installing/index.html">Installing Python Modules</a><br/>
                <span class="linkdescr">installing from the Python Package Index &amp; other sources</span></p>
            <p class="biglink"><a class="biglink" href="distributing/index.html">Distributing Python Modules</a><br/>
                <span class="linkdescr">publishing modules for installation by others</span></p>
            <p class="biglink"><a class="biglink" href="extending/index.html">Extending and Embedding</a><br/>
                <span class="linkdescr">tutorial for C/C++ programmers</span></p>
            <p class="biglink"><a class="biglink" href="c-api/index.html">Python/C API</a><br/>
                <span class="linkdescr">reference for C/C++ programmers</span></p>
            <p class="biglink"><a class="biglink" href="faq/index.html">FAQs</a><br/>
                <span class="linkdescr">frequently asked questions (with answers!)</span></p>
            </td></tr>
        </table>

        <p><strong>Indices and tables:</strong></p>
        <table class="contentstable" align="center"><tr>
            <td width="50%">
            <p class="biglink"><a class="biglink" href="py-modindex.html">Python Global Module Index</a><br/>
                <span class="linkdescr">quick access to all modules</span></p>
            <p class="biglink"><a class="biglink" href="genindex.html">General Index</a><br/>
                <span class="linkdescr">all functions, classes, terms</span></p>
            <p class="biglink"><a class="biglink" href="glossary.html">Glossary</a><br/>
                <span class="linkdescr">the most important terms explained</span></p>
            </td><td width="50%">
            <p class="biglink"><a class="biglink" href="search.html">Search page</a><br/>
                <span class="linkdescr">search this documentation</span></p>
            <p class="biglink"><a class="biglink" href="contents.html">Complete Table of Contents</a><br/>
                <span class="linkdescr">lists all sections and subsections</span></p>
            </td></tr>
        </table>
        re   r`   s    r   python_docsTestReadHtml.python_docs  s    -r   c                 f    UR                  US9  U" UR                  SS9n[        U5      S:  d   eg )Nr   Pythonr<   r   )r   rM   r(   )r`   rb  r   rY   r   s        r   test_multiple_matches"TestReadHtml.test_multiple_matches  s5     	   5z~~X>3x!||r   c                     UR                  US9  U" UR                  SS9nU Vs/ s H  oUR                  S   SS PM     nn[        U5      SS/:X  d   eg s  snf )	Nr   re  r<   r   r   ro   PythWhat)r   rM   r   sorted)r`   rb  r   rY   r   r   zzs          r   test_python_docs_table#TestReadHtml.test_python_docs_table%  sb     	   5z~~X>+./3RggdmAa 3/bzff---- 0s   Ac                 L    SnU" [        U5      5      n[        U5      S:X  d   eg)z0
Make sure that read_html ignores empty tables.
a  
            <table>
                <thead>
                    <tr>
                        <th>A</th>
                        <th>B</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                    </tr>
                </tbody>
            </table>
            <table>
                <tbody>
                </tbody>
            </table>
        r   N)r   r(   )r`   rY   r>   r   s       r   test_empty_tablesTestReadHtml.test_empty_tables-  s+    ( "(4.16{ar   c                 |    U" [        S5      5      S   n[        SS/SS//SS/S	9n[        R                  " X#5        g )
Na  <table>
            <thead>
                <tr>
                    <th>A</th>
                    <th>B</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>2</td>
                </tr>
            </tbody>
            <tbody>
                <tr>
                    <td>3</td>
                    <td>4</td>
                </tr>
            </tbody>
        </table>r   r   rn   rp   ro   ABr   rs   r   r   r,   r-   r`   rY   r   r   s       r   test_multiple_tbody TestReadHtml.test_multiple_tbodyH  sR     "
. /2 Aq6Aq6"2S#JG
f/r   c                 r    U" [        S5      5      S   n[        SS0S/S9n[        R                  " X#5        g)z\
Don't fail with bs4 when there is a header and only one column
as described in issue #9178
a3  <table>
                <thead>
                    <tr>
                        <th>Header</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>first</td>
                    </tr>
                </tbody>
            </table>r   Headerfirstr   r   Nrv  rw  s       r   test_header_and_one_column'TestReadHtml.test_header_and_one_columnh  sH    
 "
 " 8W"5aSA
f/r   c                 v    U" [        S5      5      S   n[        / SQ// SQS9n[        R                  " X#5        g)z;
Ensure parser adds <tr> within <thead> on malformed HTML.
a  <table>
            <thead>
                <tr>
                    <th>Country</th>
                    <th>Municipality</th>
                    <th>Year</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Ukraine</td>
                    <th>Odessa</th>
                    <td>1944</td>
                </tr>
            </tbody>
        </table>r   )UkraineOdessa  )CountryMunicipalityYearru  Nrv  rw  s       r   test_thead_without_tr"TestReadHtml.test_thead_without_tr  sJ     "
& '* -.7

 	f/r   c                 .   Sn[        SS//SS/S9n[        SS/SS//SS/S9nUR                  S	S
9nUR                  SS
9nU" [        U5      5      S   nU" [        U5      5      S   n[        R                  " Xs5        [        R                  " X5        g)zP
Make sure that read_html reads tfoot, containing td or th.
Ignores empty tfoot
a  <table>
            <thead>
                <tr>
                    <th>A</th>
                    <th>B</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>bodyA</td>
                    <td>bodyB</td>
                </tr>
            </tbody>
            <tfoot>
                {footer}
            </tfoot>
        </table>bodyAbodyBrs  rt  ru  footAfootB )footerz%<tr><td>footA</td><th>footB</th></tr>r   N)r   r}   r   r,   r-   )	r`   rY   data_template	expected1	expected2r  r  result1result2s	            r   test_tfoot_readTestReadHtml.test_tfoot_read  s    
$ Wg$6#7#sL	G$w&89C:
	 $$B$/$$,S$T"8E?3A6"8E?3A6
g1
g1r   c                 p    U" [        S5      SS9S   n[        SS//SS9n[        R                  " X#5        g )Na
  
            <table>
                <tr>
                    <td>S</td>
                    <td>I</td>
                </tr>
                <tr>
                    <td>text</td>
                    <td>1944</td>
                </tr>
            </table>
        r   r   textr  )SIrr   rv  rw  s       r   &test_parse_header_of_non_string_column3TestReadHtml.test_parse_header_of_non_string_column  sM     " 
  !$ vtn-zB
f/r   c                   ^ SSK Jm  U4S jnU" USSS0S9S   n[        U" SS	S
S5      [        [        S.S9nUR                  UR                  :X  d   e/ SQn/ SQnUR                  U5      R                  Xx5      n	UR                  U5      n
U	nSS/nX   R                  [        5      X'   [        R                  " X5        g )Nr   )_remove_whitespacec                 :   >  T" U 5      $ ! [          a    U s $ f = fr!   )AttributeError)r$   r  s    r   try_remove_ws8TestReadHtml.test_banklist_header.<locals>.try_remove_ws  s'    )!,,! s    r@  r   r   r   r   r   csvzbanklist.csv)Updated DateClosing Date
converters)
z,First Vietnamese American Bank In Vietnamesez"Westernbank Puerto Rico En Espanolz*R-G Premier Bank of Puerto Rico En EspanolzEurobank En EspanolzSanderson State Bank En EspanolzLWashington Mutual Bank (Including its subsidiary Washington Mutual Bank FSB)zSilver State Bank En Espanolz%AmTrade International Bank En EspanolzHamilton Bank, NA En Espanolz6The Citizens Savings Bank Pioneer Community Bank, Inc.)
zFirst Vietnamese American BankzWesternbank Puerto RicozR-G Premier Bank of Puerto RicoEurobankzSanderson State BankzWashington Mutual BankzSilver State BankzAmTrade International BankzHamilton Bank, NAzThe Citizens Savings Bankr  r  )pandas.io.htmlr  r   r   shaper*   replaceapplyr   r,   r-   )r`   rk   r   rY   r  r   ground_trutholdnewdfnewgtnew	converted	date_colsr  s                @r   test_banklist_header!TestReadHtml.test_banklist_header  s    5	 m9T7OTUVWT65.9(19M
 xx<-----

 }%--c7  /	#^4	(399+F	
i/r   c                     Sn[        USS9 nUR                  5       nS S S 5        UW;   d   eU" USSS0S9S   nX6R                  5       ;   d   eg ! , (       d  f       N9= f)NzGold Canyonr   r   r   r   r   r   )r   r   	to_string)r`   rk   rY   gcr   raw_textr   s          r   test_gold_canyonTestReadHtml.test_gold_canyon  sk    -'2avvxH 3 X~~tWo

 \\^### 32s   A
Ac                 |    U" [        S5      SS9S   nU" [        S5      SS9S   n[        R                  " X25        g )Na  <table>
                        <thead>
                            <tr style="text-align: right;">
                            <th></th>
                            <th>C_l0_g0</th>
                            <th>C_l0_g1</th>
                            <th>C_l0_g2</th>
                            <th>C_l0_g3</th>
                            <th>C_l0_g4</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                            <th>R_l0_g0</th>
                            <td> 0.763</td>
                            <td> 0.233</td>
                            <td> nan</td>
                            <td> nan</td>
                            <td> nan</td>
                            </tr>
                            <tr>
                            <th>R_l0_g1</th>
                            <td> 0.244</td>
                            <td> 0.285</td>
                            <td> 0.392</td>
                            <td> 0.137</td>
                            <td> 0.222</td>
                            </tr>
                        </tbody>
                    </table>r   rR   a  <table>
                    <thead>
                        <tr style="text-align: right;">
                        <th></th>
                        <th>C_l0_g0</th>
                        <th>C_l0_g1</th>
                        <th>C_l0_g2</th>
                        <th>C_l0_g3</th>
                        <th>C_l0_g4</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                        <th>R_l0_g0</th>
                        <td> 0.763</td>
                        <td> 0.233</td>
                        </tr>
                        <tr>
                        <th>R_l0_g1</th>
                        <td> 0.244</td>
                        <td> 0.285</td>
                        <td> 0.392</td>
                        <td> 0.137</td>
                        <td> 0.222</td>
                        </tr>
                    </tbody>
                 </table>)r   r,   r-   )r`   rY   r   r   s       r   test_different_number_of_cols*TestReadHtml.test_different_number_of_cols  sf    # @ C"
D E"H ": =
> ?B 	f/r   c                 v    U" [        S5      5      S   n[        / SQ// SQS9n[        R                  " X#5        g )NaZ  
            <table>
                <tr>
                    <th>A</th>
                    <th colspan="1">B</th>
                    <th rowspan="1">C</th>
                </tr>
                <tr>
                    <td>a</td>
                    <td>b</td>
                    <td>c</td>
                </tr>
            </table>
        r   r   )rs  rt  Crr   rv  rw  s       r   test_colspan_rowspan_1#TestReadHtml.test_colspan_rowspan_1e  sB    !
" #& o.H
f/r   c                 t    U" [        S5      SS9S   n[        / SQ// SQS9n[        R                  " X#5        g )Na  
            <table>
                <tr>
                    <td colspan="2">X</td>
                    <td>Y</td>
                    <td rowspan="2">Z</td>
                    <td>W</td>
                </tr>
                <tr>
                    <td>A</td>
                    <td colspan="2">B</td>
                    <td>C</td>
                </tr>
            </table>
        r   r  )rs  rt  rt  Zr  )XzX.1Yr  Wru  rv  rw  s       r    test_colspan_rowspan_copy_values-TestReadHtml.test_colspan_rowspan_copy_values~  sO     "" %
& '* +,6Q
 	f/r   c                 t    U" [        S5      SS9S   n[        / SQ// SQS9n[        R                  " X#5        g )Na(  
            <table>
                <tr>
                    <td rowspan="2">A</td>
                    <td rowspan="2" colspan="3">B</td>
                    <td>C</td>
                </tr>
                <tr>
                    <td>D</td>
                </tr>
            </table>
        r   r  )rs  rt  rt  rt  D)rs  rt  zB.1zB.2r  ru  rv  rw  s       r   test_colspan_rowspan_both_not_1,TestReadHtml.test_colspan_rowspan_both_not_1  sO     " 
  !$ +,6S
 	f/r   c                 t    U" [        S5      SS9S   n[        SS//SS/S9n[        R                  " X#5        g )Nz
            <table>
                <tr>
                    <td>A</td>
                    <td rowspan="2">B</td>
                </tr>
                <tr>
                    <td>C</td>
                </tr>
            </table>
        r   r  r  rt  rs  ru  rv  rw  s       r   test_rowspan_at_end_of_row'TestReadHtml.test_rowspan_at_end_of_row  sP     "
 
 " C:,c
C
f/r   c                 z    U" [        S5      SS9S   n[        SS/SS//SS/S9n[        R                  " X#5        g )Nz
            <table>
                <tr>
                    <td rowspan="3">A</td>
                    <td rowspan="3">B</td>
                </tr>
            </table>
        r   r  rs  rt  ru  rv  rw  s       r   test_rowspan_only_rows#TestReadHtml.test_rowspan_only_rows  sW     "	 
  C:Sz":S#JO
f/r   c                     U" [        S5      5      S   n[        SS/SS//SS/SS//S9n[        SS	//US
9n[        R                  " X$5        g )Nam  
            <table>
                <tr>
                    <th>A</th>
                    <th>B</th>
                </tr>
                <tr>
                    <th>a</th>
                    <th>b</th>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                </tr>
            </table>
        r   rs  rt  r   r   r   levelscodesrn   ru  r   r   r   r,   r-   r`   rY   r   rs   r   s        r   +test_header_inferred_from_rows_with_only_th8TestReadHtml.test_header_inferred_from_rows_with_only_th  sl    !
& '* c3Z#s$<aVaQRVDTUAq6(G<
f/r   c                     [        S[        SSS905      nUR                  5       nU" [        U5      S/SS9n[        R
                  " X$S   5        U" [        U5      S/SS9n[        R
                  " X$S   5        g )Ndate1/1/2001
   periodsr   r   parse_datesrR   )r   r   r   r   r,   r-   )r`   rY   r   r   r   s        r   test_parse_dates_list"TestReadHtml.test_parse_dates_list  sr    
:r BCD::<x1saP
ba&)x1xSTU
ba&)r   c                    [        [        SSS95      n[        UR                  S 5      UR                  S 5      S.5      nU" [	        UR                  5       5      SSS	/0SS
9n[        SU05      n[        R                  " XTS   5        g )Nr  r  r  c                 4    [        U R                  5       5      $ r!   )strr  r$   s    r   r&   7TestReadHtml.test_parse_dates_combine.<locals>.<lambda>      AFFHr   c                 4    [        U R                  5       5      $ r!   )r  timer  s    r   r&   r    r  r   )r  r  datetimer   rn   r  r   )r   r   r   r*   r   r   r,   r-   )r`   rY   	raw_datesr   r   newdfs         r   test_parse_dates_combine%TestReadHtml.test_parse_dates_combine  s    :j"=>	!&=>!&=>
 RZZ\"aV0DPQ
 :y12
eV,r   c                    U" SSSS5      n[         R                  R                  U5      (       d   [        U5       S35       e[         R                  R	                  U5      (       d   [        U5       S35       eU" USSS	9S
   nUR
                  S:X  d   eSUR                  S   ;   d   eUS   R                  [        R                  " S5      :X  d   e[        R                  " UR                  S   S5      (       d   eg )Nr   r   r>   wikipedia_states.htmlz is not a filez is an empty fileArizonar   r   r   )<      Unnamedr   sq mifloat64)r   r  HzPN$A)r3  r4  isfilereprgetsizer  rs   r   rw   allcloselocr`   r   rY   r   r   s        r   test_wikipedia_states_table(TestReadHtml.test_wikipedia_states_table%  s    ff.EFww~~d##BT
|>%BB#wwt$$Fd4E&FF$!$iB1E||x'''FNN2....g$$(;;;;{{6::j19====r   c                    U" SSSS5      nU" USSS9S   nUR                   S:X  d   eS	UR                  S
   S   ;   d   eUR                  R                  S:X  d   e[        R                  " UR
                  S   S5      (       d   eg )Nr   r   r>   r  r  r   r  )r     r  r   r   rn   )Alaska)zTotal area[2]r  r  )r  rs   nlevelsrw   r  r  r  s        r    test_wikipedia_states_multiindex-TestReadHtml.test_wikipedia_states_multiindex/  s    ff.EF!$i1EaH||x'''FNN2.q1111~~%%***{{6::&JKYWWWWr   c                     U" [        S5      SS/S9n[        SS//[        R                  " SS/5      S	9n[        R
                  " US   U5        g )
NaK  
                <table>
                    <thead>
                        <tr><th></th><th></tr>
                        <tr><th>A</th><th>B</th></tr>
                    </thead>
                    <tbody>
                        <tr><td>a</td><td>b</td></tr>
                    </tbody>
                </table>
            r   r   r  r   r   )Unnamed: 0_level_0rs  )zUnnamed: 1_level_0rt  rr   )r   r   r   from_tuplesr,   r-   rw  s       r   %test_parser_error_on_empty_header_row2TestReadHtml.test_parser_error_on_empty_header_row7  sd    !
 q6
  3ZL**,.IJ
 	fQi2r   c                     U" [        S5      SS9S   n[        SS0S/S9nUS   R                  [        R                  " S5      :X  d   e[        R
                  " X#5        g )	Na  <html>
            <body>
             <table>
                <thead>
                    <tr>
                        <th>Header</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1100#101</td>
                    </tr>
                </tbody>
            </table>
            </body>
        </html>#)decimalr   r{  gClg0@r}  r  )r   r   r   rw   r,   r-   rw  s       r   test_decimal_rowsTestReadHtml.test_decimal_rowsP  sm    !$ '
( ), 8X"6qcBh%%))<<<<
f/r   argTFc                     [         R                  " S5      n[        R                  " [        US9   U" XS9  S S S 5        g ! , (       d  f       g = f)NzPassing a bool to header is invalid. Use header=None for no header or header=int or list-like of ints to specify the row(s) making up the column namesr<   r  )rX  escaperB   rE   r  )r`   rg   r  rY   r3   s        r   test_bool_header_arg!TestReadHtml.test_bool_header_argm  s;     ii

 ]]9C0Y3 100s   A  
Ac                     U" [        S5      S[        0S9S   n[        SSS/05      n[        R                  " X#5        g )Na  <table>
                 <thead>
                   <tr>
                     <th>a</th>
                    </tr>
                 </thead>
                 <tbody>
                   <tr>
                     <td> 0.763</td>
                   </tr>
                   <tr>
                     <td> 0.244</td>
                   </tr>
                 </tbody>
               </table>r   r  r   z0.763z0.244)r   r  r   r,   r-   rw  s       r   test_convertersTestReadHtml.test_convertersx  sP    !" Sz%
& '* cGW#567
f/r   c                     U" [        S5      S/S9S   n[        SS[        R                  /05      n[        R
                  " X#5        g )Na  <table>
                 <thead>
                   <tr>
                     <th>a</th>
                   </tr>
                 </thead>
                 <tbody>
                   <tr>
                     <td> 0.763</td>
                   </tr>
                   <tr>
                     <td> 0.244</td>
                   </tr>
                 </tbody>
               </table>gZd;?)	na_valuesr   r   g"~j?r   r   rw   r   r,   r-   rw  s       r   test_na_valuesTestReadHtml.test_na_values  sQ    !" g%
& '* cE266?34
f/r   c                     Sn[        SSS/05      nU" [        U5      SS9S   n[        R                  " X45        [        S[        R
                  [        R
                  /05      nU" [        U5      SS9S   n[        R                  " X45        g )	Na  <table>
                        <thead>
                            <tr>
                            <th>a</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                            <td> N/A</td>
                            </tr>
                            <tr>
                            <td> NA</td>
                            </tr>
                        </tbody>
                    </table>r   zN/Ar
   F)keep_default_nar   T)r   r   r,   r-   rw   r   )r`   rY   	html_dataexpected_dfhtml_dfs        r   test_keep_default_na!TestReadHtml.test_keep_default_na  s     	   udm 45"8I#6NqQ
k3rvvrvv&6 78"8I#6MaP
k3r   c                     U" [        S5      5      S   n[        SS/[        R                  [        R                  //SS/S9n[        R
                  " X#5        g )Nak  
            <table>
                <tr>
                    <th>A</th>
                    <th>B</th>
                </tr>
                <tr>
                    <td>a</td>
                    <td>b</td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                </tr>
            </table>
        r   r   r   rs  rt  ru  r   rw  s       r   test_preserve_empty_rows%TestReadHtml.test_preserve_empty_rows  sZ    !
& '* C:/?"@3PS*U
f/r   c                     U" [        S5      5      S   n[        SS/SS//SS/SS//S9n[        SS	//US
9n[        R                  " X$5        g )NaU  
            <table>
                <thead>
                    <tr><th></th><th></tr>
                    <tr><th>A</th><th>B</th></tr>
                    <tr><th>a</th><th>b</th></tr>
                </thead>
                <tbody>
                    <tr><td>1</td><td>2</td></tr>
                </tbody>
            </table>
        r   rs  rt  r   r   r   r  rn   ru  r  r  s        r   ,test_ignore_empty_rows_when_inferring_header9TestReadHtml.test_ignore_empty_rows_when_inferring_header  sl    !
 " c3Z#s$<aVaQRVDTUAq6(G<
f/r   c                     [        / SQS9n/ SQ/ SQ/Ul        UR                  SS9nU" [        U5      5      S   n[        R
                  " X$5        g )N))HillaryD   r  )BernieJ   r  )DonaldE   R)r   )r  AgeParty)NamezUnnamed: 1_level_1zUnnamed: 2_level_1Fr   r   )r   rs   r   r   r,   r-   )r`   rY   r&  r>   r'  s        r   test_multiple_header_rows&TestReadHtml.test_multiple_header_rows  sW    Q
 3@
 """/"8D>215
k3r   c                     U" SSSS5      nU" USS9n[        U[        5      (       d   e[        US   [        5      (       d   eg )Nr   r   r>   rQ   r   r  )r#   r|   r   )r`   r   rY   rS   r   s        r   test_works_on_valid_markup'TestReadHtml.test_works_on_valid_markup  sI    D&&2EFx15#t$$$$#a&),,,,r   c                 .    U" SSSS5      nU" USSS/S9  g )	Nr   r   r>   rj   r   rP   r:   rK   re   )r`   r   rY   rk   s       r   test_fallback_success"TestReadHtml.test_fallback_success  s#     vvGk6:BVWr   c                     [        SSS9n[        [        R                  R	                  S5      R                  S5      US9nUR                  5       nSU;   d   eg )Nz
2000-01-01r  r  rn   )r  ro   r   )r   r   rw   rx   ry   standard_normalr   )r`   rngr   r   s       r   test_to_html_timestamp#TestReadHtml.test_to_html_timestamp  sN    r2ryy,,Q/??HPSTv%%%r   c                 P   [        SSS./5      nUR                  5       nUR                  SS9nUR                  SS9nUR                  SS9nUR                  SS9nUR                  SS9nSU;   d   eX2:X  d   eX$:X  d   eX%:w  d   eS	U;   d   eS
U;  d   eSU;  d   eXg:X  d   eg )Nr   rn   rs  rt  T)borderr   Fz border="1"z border="2"z border="0"z border)r   r   )r`   r   out_border_defaultout_border_trueout_border_explicit_defaultout_border_nondefaultout_border_zeroout_border_falses           r   test_to_html_borderless$TestReadHtml.test_to_html_borderless  s    aa()*ZZ\**D*1&(jjj&:# "

!
 4**A*.::U:3 2222444!@@@!::: 5555O333 0000222r   zdisplayed_only,exp0,exp1fooNzfoo  bar  baz  quxc                     SnU" [        U5      US9n[        R                  " US   U5        Ub  [        R                  " US   U5        g [        U5      S:X  d   eg )Na  <html>
          <body>
            <table>
              <tr>
                <td>
                  foo
                  <span style="display:none;text-align:center">bar</span>
                  <span style="display:none">baz</span>
                  <span style="display: none">qux</span>
                </td>
              </tr>
            </table>
            <table style="display: none">
              <tr>
                <td>foo</td>
              </tr>
            </table>
          </body>
        </html>displayed_onlyr   r   )r   r,   r-   r(   )r`   rV  exp0exp1rY   r   r   s          r   test_displayed_only TestReadHtml.test_displayed_only+  sY    ( x~nM
c!fd+!!#a&$/s8q= =r   rV  c                 ~    SnU" [        U5      US9S   n[        SS/SS/S.5      n[        R                  " XE5        g )	NaW  
        <table>
            <tr>
                <th>A</th>
                <th>B</th>
            </tr>
            <tr>
                <td>1</td>
                <td>2</td>
            </tr>
            <tr>
                <td><span style="display:none"></span>4</td>
                <td>5</td>
            </tr>
        </table>
        rU  r   r   ro   rn   r   rI  rv  )r`   rV  rY   
html_tabler   r   s         r   &test_displayed_only_with_many_elements3TestReadHtml.test_displayed_only_with_many_elementsP  sK    
  "(:"6~V
 Aq6A78
f/r   z\ignore:You provided Unicode markup but also provided a value for from_encoding.*:UserWarningc                    [         R                  R                  U5      n[         R                  R                  U5      S   nUR	                  S5      u  pV [        US5       nU" UR                  5       USS9R                  5       nS S S 5        [        US5       nU" [        UR                  5       5      USS9R                  5       n	S S S 5        U" XSS9R                  5       n
[        R                  " WW	5        [        R                  " X5        g ! , (       d  f       N= f! , (       d  f       Nb= f! [         a2    [        5       (       a!  SU;   d  SU;   a  [        R                  " 5         e f = f)Nr   _rb)r   rR   1632)r3  r4  basenamesplitextsplitr   r   popr   r,   r-   	Exceptionr	   rB   skip)r`   r   rY   	base_pathrootr`  r   fobjfrom_stringfrom_file_likefrom_filenames              r   test_encodeTestReadHtml.test_encodeh  s4    GG$$%78	ww	*1-jjo	($/4.IIK(a#%  0
 ($/4!1DIIK(8q"#%  0
 -"ce  !!+~>!!+= 0/
 0/  	"$$8#tx'7KKM	s=   D6 "%DD6 .D%	A
D6 
D"D6 %
D3/D6 6<E2c                 0   UR                   R                  S5      S:X  a  [        R                  " S5         " S S[        5      nU" S5      nU" U5      (       d   e[        R
                  " [        SS9   U" U5        S S S 5        g ! , (       d  f       g = f)	NrA   rP   zNot applicable for lxmlc                       \ rS rSrS rSrg)FTestReadHtml.test_parse_failure_unseekable.<locals>.UnseekableStringIOi  c                     gNFre   ra  s    r   seekableOTestReadHtml.test_parse_failure_unseekable.<locals>.UnseekableStringIO.seekable  s    r   re   N)__name__
__module____qualname____firstlineno__rw  __static_attributes__re   r   r   UnseekableStringIOrt    s    r   r~  z?
            <table><tr><td>spam<foobr />eggs</td></tr></table>z#passed a non-rewindable file objectr<   )keywordsgetrB   ri  r   rE   rL   )r`   rY   r~  bads       r   test_parse_failure_unseekable*TestReadHtml.test_parse_failure_unseekable  s     $$((2f<KK12	 	 !B

  $$$$]]:-RSS! TSSs   5	B
Bc                 t     " S S5      nU" S5      nU" S5      nU" U5      (       d   eU" U5      (       d   eg )Nc                   H    \ rS rSrSS jrSS jrS rS rS rS\	4S	 jr
S
rg)9TestReadHtml.test_parse_failure_rewinds.<locals>.MockFilei  returnNc                     Xl         SU l        g rv  )r   at_end)r`   r   s     r   __init__BTestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.__init__  s     	#r   c                 R    U R                   (       a  SOU R                  nSU l         U$ )Nr  Tr  r   )r`   sizer   s      r   r   >TestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.read  s    ![[rdii"r   c                     SU l         g rv  )r  )r`   offsets     r   seek>TestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.seek  s	    #r   c                     g)NTre   ra  s    r   rw  BTestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.seekable  s    r   c                     g r!   re   ra  s    r   __next__BTestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.__next__  s    r   c                     U $ r!   re   ra  s    r   __iter__BTestReadHtml.test_parse_failure_rewinds.<locals>.MockFile.__iter__  s	     r   r  )r  Nr!   )ry  rz  r{  r|  r  r   r  rw  r  r   r  r}  re   r   r   MockFiler    s'    $
$( r   r  z/<table><tr><td>spam<br />eggs</td></tr></table>z2<table><tr><td>spam<foobr />eggs</td></tr></table>re   )r`   rY   r  goodr  s        r   test_parse_failure_rewinds'TestReadHtml.test_parse_failure_rewinds  sF    	 	2 IJKL%%%%$$$$r   c                     " S S[         R                  5      nU" SSSS5      nU" X$4S9nU" X$4S9nUR                  5         UR                  5         UR                  5       (       d  UR                  5       (       a/   UR                  5       (       a  M  UR                  5       (       a  M/  S UR                  s=L a  UR                  L d   e   eg )Nc                   (   ^  \ rS rSrU 4S jrSrU =r$ )@TestReadHtml.test_importcheck_thread_safety.<locals>.ErrorThreadi  c                 l   >  [         TU ]  5         S U l        g ! [         a  nXl         S nAg S nAff = fr!   )superrunerrrh  )r`   r  	__class__s     r   r  DTestReadHtml.test_importcheck_thread_safety.<locals>.ErrorThread.run  s3    $GKM  $DH ! #"HH#s    
3.3)r  )ry  rz  r{  r|  r  r}  __classcell__)r  s   @r   ErrorThreadr    s    $ $r   r  r   r   r>   rQ   )targetr1   )	threadingThreadstartis_aliver  )r`   r   rY   r  rS   helper_thread1helper_thread2s          r   test_importcheck_thread_safety+TestReadHtml.test_importcheck_thread_safety  s    
	$)** 	$ D&&2EF$,<;O$,<;O%%''>+B+B+D+D %%''>+B+B+D+D~))?^-?-??????r   c                     U" SSSS5      n[        U5      nU" U5      S   nU" U5      S   n[        R                  " XV5        g )Nr   r   r>   r?   r   )r   r,   r-   )r`   r   rY   file_path_string	file_pathr   r   s          r   test_parse_path_object#TestReadHtml.test_parse_path_object  sK    #D&&+F)*	/03y)!,
c'r   c                 r    U" [        S5      5      S   n[        S//S/S9n[        R                  " X#5        g )Nz
            <table>
                <tr>
                    <th>A</th>
                </tr>
                <tr>
                    <td>word1<br>word2</td>
                </tr>
            </table>
        r   zword1 word2rs  ru  rv  rw  s       r   test_parse_br_as_space#TestReadHtml.test_parse_br_as_space  sF    !	
  M?"3cUC
f/r   )r)   bodyr   r  c                 h   Sn/ SQ/ SQ/ SQ/ SQ/ SQ/ SQS.nUS	   nUS
   nUS   nUS:X  a  US   nUS   nUS   nO#US:X  a  US   nOUS:X  a  US   nOUS:X  a  US   nU" [        U5      US9S   n[        XV/US9n	U	R                  [        R                  5      n	[
        R                  " X5        g )Na  
          <table>
            <tr>
              <th>HTTP</th>
              <th>FTP</th>
              <th><a href="https://en.wiktionary.org/wiki/linkless">Linkless</a></th>
            </tr>
            <tr>
              <td><a href="https://en.wikipedia.org/">Wikipedia</a></td>
              <td>SURROUNDING <a href="ftp://ftp.us.debian.org/">Debian</a> TEXT</td>
              <td>Linkless</td>
            </tr>
            <tfoot>
              <tr>
                <td><a href="https://en.wikipedia.org/wiki/Page_footer">Footer</a></td>
                <td>
                  Multiple <a href="1">links:</a> <a href="2">Only first captured.</a>
                </td>
              </tr>
            </tfoot>
          </table>
          )HTTPFTPLinkless))r  N)r  N)r  z'https://en.wiktionary.org/wiki/linkless)	WikipediaSURROUNDING Debian TEXTr  ))r  zhttps://en.wikipedia.org/)r  zftp://ftp.us.debian.org/)r  N)Footer$Multiple links: Only first captured.N))r  z)https://en.wikipedia.org/wiki/Page_footer)r  1N)head_ignorehead_extractbody_ignorebody_extractfooter_ignorefooter_extractr  r  r  r)   r  r  r  r  r  r   extract_linksr   rr   )r   r   fillnarw   r   r,   r-   )
r`   r  rY   gh_13141_datagh_13141_expecteddata_expfoot_exphead_expr   r   s
             r   test_extract_linksTestReadHtml.test_extract_links  s    0 7
 P

%
2 %]3$_5$]3%<(8H()9:H(8HF](8HH_()9:HH_(8H!(="9MaPh18D??266*
f/r   c                     Sn[         R                  " [        US9   [        USS9  S S S 5        g ! , (       d  f       g = f)NzY`extract_links` must be one of {None, "header", "footer", "body", "all"}, got "incorrect"r<   	incorrectr  rB   rE   rL   r   )r`   rg   r3   s      r   test_extract_links_bad#TestReadHtml.test_extract_links_bad:  s3    I 	 ]]:S1i{; 211r>  c                 t    SnU" [        U5      SS9S   n[        S//5      n[        R                  " X45        g )Nz
        <table>
          <tr>
            <td>
              <a href='https://google.com'>Google.com</a>
            </td>
          </tr>
        </table>
        r)   r  r   )z
Google.comzhttps://google.comrv  r`   rY   r   r   r   s        r    test_extract_links_all_no_header-TestReadHtml.test_extract_links_all_no_headerB  s?     "(4.FqICDEF
f/r   c                     Sn[         R                  " [        US9   [        SSS9  S S S 5        g ! , (       d  f       g = f)NzPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.r<   testnumpyr   r  )r`   r3   s     r   test_invalid_dtype_backend'TestReadHtml.test_invalid_dtype_backendQ  s2    % 	 ]]:S1fG4 211r>  c                     SnU" [        U5      5      S   n[        SS/SS//SS/S	9n[        R                  " X45        g )
Na  
        <table>
            <tr>
                <th>
                    <style>.style</style>
                    A
                    </th>
                <th>B</th>
            </tr>
            <tr>
                <td>A1</td>
                <td>B1</td>
            </tr>
            <tr>
                <td>A2</td>
                <td>B2</td>
            </tr>
        </table>
        r   A1B1A2B2rs  rt  ru  rv  r  s        r   test_style_tagTestReadHtml.test_style_tagY  sI    & "(4.1!4D$<$">c
S
f/r   re   )hry  rz  r{  r|  ra   rB   fixturerg   rk   r   r   marknetwork
single_cpur   r   slowr   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r"  r%  r,  r/  r7  r<  rC  rF  rI  rM  rQ  rT  rZ  r^  rb  rf  rm  rp  rx  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  parametrizer  r  r!  r(  r+  r.  r;  r>  rA  rF  rQ  r   rY  r]  tdskip_if_windowsfilterwarningsrp  r  r  r  r  r  r  r  r  r  r  r}  re   r   r   r[   r[   l   s   @ ^^; ; ^^? ?'4Il [[[[)  )  [[[[)  ) [[) )/-
-

))))))))L)
)
)
)	))) [[[[D  D
 [[[[[[@   @
 [[- - [[  [[2 2 [[0 0 [[	0 	0 [[2 2 [[2 2 [[
2 
2 [[	- 	-D
 ^^. .` [[[[  
 [[[[.  . 60@040@$2L02 [[-0 -0^ [[	$ 	$F0P02!0F0@0:0*08*->X320: [[UT5M24 34060642040.4- [[X X
&3& [["9eW%t,I345y%7IJ	
!!< [[-e}=0 >0. [[	&	 
8"( %D [[[[@  @.(0* [[U$GHB0 IB0H<050r   r[   )1collections.abcr   	functoolsr   r   r   r   r3  pathlibr   rX  r  urllib.errorr   r  rw   rB   pandas.compatr	   pandas.util._test_decoratorsutil_test_decoratorsr  pandasrz   r
   r   r   r   r   r   r   r   r   pandas._testing_testingr,   pandas.io.commonr   r  r   r7   rH   rN   rV   r   
skip_if_norY   r[   re   r   r   <module>r     s    $  
  	  !   - ) ) 
 
 
  - BB
:(M@. U2==#7z9R"STV2==#8944D0 D0r   