ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ \[c@sdZdZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZddlmZeZdejfd YZd efd YZd efd YZdefdYZdZdS(sHelper classes for tests.tMITiN(tTestCase(t BeautifulSoup(tCharsetMetaAttributeValuetCommenttContentMetaAttributeValuetDoctypet SoupStrainer(tHTMLParserTreeBuildertSoupTestcBs>eZedZdZdZddZdZRS(cCstS(N(tdefault_builder(tself((s//usr/lib/python2.7/site-packages/bs4/testing.pyR scKs(|jd|j}t|d||S(s*Build a Beautiful Soup object from markup.tbuilder(tpopR R(R tmarkuptkwargsR ((s//usr/lib/python2.7/site-packages/bs4/testing.pytsoup scCs|jj|S(s[Turn an HTML fragment into a document. The details depend on the builder. (R ttest_fragment_to_document(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt document_for%scCsS|j}t|d|}|dkr0|}n|j|j|j|dS(NR (R RtNonet assertEqualtdecodeR(R tto_parsetcompare_parsed_toR tobj((s//usr/lib/python2.7/site-packages/bs4/testing.pytassertSoupEquals,s    cCsSd}xF|jD];}|rE|j||j|j||jn|}qWdS(syEnsure that next_element and previous_element are properly set for all descendants of the given element. N(Rt descendantsRt next_elementtprevious_element(R telementtearlierte((s//usr/lib/python2.7/site-packages/bs4/testing.pytassertConnectedness4s N( t__name__t __module__tpropertyR RRRRR (((s//usr/lib/python2.7/site-packages/bs4/testing.pyR s    tHTMLTreeBuilderSmokeTestcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Zd$Z%d%Z&d&Z'd'Z(d(Z)d)Z*d*Z+d+Z,d,Z-d-Z.d.Z/d/Z0d0Z1d1Z2d2Z3d3Z4d4Z5d5Z6d6Z7d7Z8d8Z9RS(9sCA basic test of a treebuilder's competence. Any HTML treebuilder, present or future, should be able to pass these tests. With invalid markup, there's room for interpretation, and different parsers can handle it differently. But with the markup in these tests, there's not much room for interpretation. cCs|xuddddddddd d d d d dddddgD]7}|jd}|j|}|jt|jq=WdS(smVerify that all HTML4 and HTML5 empty element (aka void element) tags are handled correctly. tareatbasetbrtcoltembedthrtimgtinputtkeygentlinktmenuitemtmetatparamtsourcettracktwbrtspacertframetN(Rtnew_tagRtTruetis_empty_element(R tnameRR8((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_empty_element_tagsIs 0cCsc|jd}tj|d}tj|}|j|jt|j|j|jdS(Ns fooi(RtpickletdumpstloadsRt __class__RR(R ttreetdumpedtloaded((s//usr/lib/python2.7/site-packages/bs4/testing.pyt!test_pickle_and_unpickle_identityUs cCs|j|\}}|jd}|j|jt|j|||jt|t| ||j|jjdddS(s8Assert that a given doctype string is handled correctly.itfooN(t_document_with_doctypetcontentsRR@Rtstrtlentp(R tdoctype_fragmentt doctype_strRtdoctype((s//usr/lib/python2.7/site-packages/bs4/testing.pytassertDoctypeHandled^s   cCs-d|}|d}|j|}||fS(s5Generate and parse a document with the given doctype.s s

foo

(R(R RKRMRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyRFls  cCs|jd|jddS(s?Make sure normal, everyday HTML doctypes are handled correctly.thtmls4html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"N(RN(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_normal_doctypesss cCs6|jd}|jd}|jd|jdS(Ns iR7(RRGRtstrip(R RRM((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_empty_doctypeys cCsd}|j|dS(Nsnhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"(RN(R RM((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_public_doctype_with_url~scCs|jddS(Ns$foo SYSTEM "http://www.example.com/"(RN(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_system_doctypescCs|jddS(Ns#xsl:stylesheet SYSTEM "htmlent.dtd"(RN(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_namespaced_system_doctypescCs|jddS(Ns#xsl:stylesheet PUBLIC "htmlent.dtd"(RN(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_namespaced_public_doctypescCsJd}|j|}|j|jdjdd|jdddS(sJA real XHTML document should come out more or less the same as it went in.s Hello. Goodbye. sutf-8s R7N(RRtencodetreplace(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_real_xhtml_documents cCs8d}|j|}|jdt|jddS(stWhen a namespaced XML document is parsed as HTML it should be treated as HTML with weird tag names. s.contentisns1:fooN(RRRItfind_all(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_namespaced_htmlscCs]d}|j|}|j||jd}|j|}|j||jddS(Nustutf8(RRRRW(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_processing_instructions cCstj|jdS(sMake sure you can copy the tree builder. This is important because the builder is part of a BeautifulSoup object, and we want to be able to copy that. N(tcopytdeepcopyR (R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt test_deepcopyscCs?|jd}|j|jj|jt|jddS(sA

tag is never designated as an empty-element tag. Even if the markup shows it as an empty-element tag, it shouldn't be presented that way. s

s

N(Rt assertFalseRJR:RRH(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt!test_p_tag_is_never_empty_elementscCs4|jdd|jdd|jdddS(sA tag that's not closed by the end of the document should be closed. This applies to all tags except empty-element tags. s

s

sss
s
N(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_unclosed_tags_get_closedscCs?|jd}|j|jj|jt|jddS(sA
tag is designated as an empty-element tag. Some parsers treat

as one
tag, some parsers as two tags, but it should always be an empty-element tag. s

s
N(Rt assertTrueR'R:RRH(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt#test_br_is_always_empty_element_tagscCs|jddS(Ns(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_nested_formatting_elementsscCs6d}|j|}|jd|jdddS(Ns Ordinary HEAD element test Hello, world! stext/javascripttscriptttype(RRtfind(R ROR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_double_heads cCsd}|j||j|}|jdd}|j|jt|jdd}|j||j|jdd}|j||jdS(Ns

foobaz

ttexttfoobarREtbaz(RRRiRR@RRR(R RRtcommentRERm((s//usr/lib/python2.7/site-packages/bs4/testing.pyt test_comments cCsd}d}|j||j||j|}|j|jj||j|}|j|jj||jd}|j|jjddS(sWhitespace must be preserved in
 and sN(RRRtpretprettifyttextarea(Rt
pre_markupttextarea_markupR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt-test_preserved_whitespace_in_pre_and_textareas

cCs=d}|j|d}|j|d}|j|dS(s+Inline elements can be nested indefinitely.sInside a B tags!

A nested tag

s/

A doubly nested tag

N(R(R tb_tagt nested_b_tagtdouble_nested_b_tag((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_nested_inline_elements s   cCsK|jd}|j}|j|jjjd|j|jjddS(sBlock elements can be nested.s*

Foo

tFooN(Rt blockquoteRRJtbtstring(R RR{((s//usr/lib/python2.7/site-packages/bs4/testing.pyt test_nested_block_level_elementss cCs'd}|j|d|jddS(s$One table can go inside another one.s[sh
Here's another table:
foo
Here's another table:
foo
s{
Foo
Bar
Baz
N(R(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_correctly_nested_tabless cCs6d}|j|}|jdg|jjddS(Ns1
tcsstclass(RRtdiv(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt(test_deeply_nested_multivalued_attribute0scCs6d}|j|}|jddg|jddS(NstaR|R(RRRO(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt"test_multivalued_attribute_on_html8scCs|jdddS(Nss(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt3test_angle_brackets_in_attribute_values_are_escaped@scCs|jdddS(Nu$

• AT&T is in the s&p 500

u)

• AT&T is in the s&p 500

(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt3test_strings_resembling_character_entity_referencesCscCs/d}|j|}|jd|jjdS(Ns%

“Hello” -☃

u“Hello” -☃(Rt assertEqualsRJR}(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt*test_entities_in_foreign_document_encodingKscCsJd}|jd||jd||jd||jd|dS(Nu

s

s

s

s

(R(R texpect((s//usr/lib/python2.7/site-packages/bs4/testing.pyt0test_entities_in_attributes_converted_to_unicodeWs cCsJd}|jd||jd||jd||jd|dS(Nu

piñata

s

piñata

s

piñata

s

piñata

s

piñata

(R(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt*test_entities_in_text_converted_to_unicode^s cCs|jdddS(Ns#

I said "good day!"

s

I said "good day!"

(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt,test_quot_entity_converted_to_quotation_markes cCs:d}|jd||jd||jd|dS(Nu�s�s�s �(R(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_out_of_range_entityiscCsR|jd}|jd|jjjj|jd|jj|j|dS(sDMostly to prevent a recurrence of a bug in the html5lib treebuilder.s!

foo

RJN(RRth2R}RR;RJR (R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_multipart_stringsoscCs$|jdd|jdddS(sqVerify consistent handling of empty-element tags, no matter how they come in through the markup. s


s


N(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyR<vscCs<d}|j|}|jd|jj|j|dS(s8Prevent recurrence of a bug in the html5lib treebuilder.s? foo N(RtassertNotEqualRROtbodyR (R tcontentR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt#test_head_tag_between_head_and_body}scCs)d}|j|}|j|jdS(s8Prevent recurrence of a bug in the html5lib treebuilder.s N(RR tarticle(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_multiple_copies_of_a_tags cCs}d}|j|}|j||j|j}|jd|jd|jd|jd|jd|jddS( sParsers don't need to *understand* namespaces, but at the very least they should not choke on namespaces or lose data.s4shttp://www.w3.org/1999/xhtmltxmlnss"http://www.w3.org/1998/Math/MathMLs xmlns:mathmlshttp://www.w3.org/2000/svgs xmlns:svgN(RRRWRO(R RRRO((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_basic_namespacess cCs6d}|j|}|jddg|jddS(NsREtbarR(RRR(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt-test_multivalued_attribute_value_becomes_listscCs/d}|j|}|jd|jjdS(NuDSacré bleu!u Sacré bleu!(RRRR}(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_can_parse_unicode_documentscCs;td}|jdd|}|j|jddS(s2Parsers should be able to work with SoupStrainers.R|s&A bold statementt parse_onlys boldN(RRRR(R tstrainerR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_soupstrainers   cCs|jdddS(Nss(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt7test_single_quote_attribute_values_become_double_quotess cCsd}|j|dS(Ns'a(R(R Rk((s//usr/lib/python2.7/site-packages/bs4/testing.pyt7test_attribute_values_with_nested_quotes_are_left_alonescCs?d}|j|}d|jd<|j|jjddS(Ns'asBrawls happen at "Bob's Bar"tattrs:a(RRERR(R RkR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt:test_attribute_values_with_double_nested_quotes_get_quoteds   cCs$|jdd|jdddS(Ns+s/s.foos2foo(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt.test_ampersand_in_attribute_value_gets_escapeds  cCs|jddS(Ns/(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt7test_escaped_ampersand_in_attribute_value_is_left_alonescCs d}d}|j||dS(Ns-

<<sacré bleu!>>

u#

<<sacré bleu!>>

(R(R Rktexpected((s//usr/lib/python2.7/site-packages/bs4/testing.pyt1test_entities_in_strings_converted_during_parsingscCs/d}|j|}|j|jjddS(Ns

Foo

u ‘Foo’(RRRJR}(R tquoteR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt)test_smart_quotes_converted_on_the_way_ins  cCs)|jd}|j|jjddS(Ns  u iu  (RRRR}(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt0test_non_breaking_spaces_converted_on_the_way_inscCsDd}djd}|j|}|j|jjd|dS(Ns-

<<sacré bleu!>>

u#

<<sacré bleu!>>

sutf-8(RWRRRJ(R RkRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt&test_entities_converted_on_the_way_outscCshd}|jd}|j|}|jd}|jdd}|jd}|j||dS(Nu

Sacré bleu!

s iso-8859-1sutf-8s ISO-Latin-1(RWRRXR(R t unicode_htmltiso_latin_htmlRtresultR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_real_iso_latin_documentscCsld}|jd}|j|}|j|jd|jd|j|jd|jddS(Nsk
Shift-JISŃR[fBOꂽ{̃t@CłB
s shift-jissutf-8teuc_jp(RRRRW(R tshift_jis_htmlRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_real_shift_jis_documents "cCsJd}|j|dd}|j|jd|jdjddS(NsHebrew (ISO 8859-8) in Visual Directionality

Hebrew (ISO 8859-8) in Visual Directionality

t from_encodings iso8859-8sutf-8(RRRWR(R thebrew_documentR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_real_hebrew_document$s  cCsd}d|}|j|}|jdidd6}|d}|jd||jt|t|jd|jd dS( NsEsj %s Shift-JIS markup goes here.R0s Content-types http-equivRstext/html; charset=x-sjisstext/html; charset=utf8R\(RRiRRdt isinstanceRRW(R tmeta_tagRRt parsed_metaR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt'test_meta_tag_reflects_current_encoding1s cCsd}d|}|j|}|jddd}|d}|jd||jt|t|jd|jddS( Ns'sj %s Shift-JIS markup goes here.R0tidtencodingtcharsetsx-sjisR\(RRiRRdRRRW(R RRRRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt3test_html5_style_meta_tag_reflects_current_encodingMs cCs9|jd}d|jd<|jd|jjdS(Ns textRREstext(RRRR(R tdata((s//usr/lib/python2.7/site-packages/bs4/testing.pyt5test_tag_with_no_attributes_can_have_attributes_addedes (:R!R"t__doc__R<RDRNRFRPRRRSRTRURVRYR[R]R`RbRcReRfRjRoRuRyR~RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s//usr/lib/python2.7/site-packages/bs4/testing.pyR$?sr                                          tXMLTreeBuilderSmokeTestcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZRS(cCsc|jd}tj|d}tj|}|j|jt|j|j|jdS(Ns fooi(RR=R>R?RR@RR(R RARBRC((s//usr/lib/python2.7/site-packages/bs4/testing.pyRDls cCs)|jd}|j|jddS(Nss. (RRRW(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_docstring_generateduscCs2d}|j|}|j||jddS(Ns, R\(RRRW(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_xml_declarationzscCs2d}|j|}|j||jddS(Ns< R\(RRRW(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyR]scCs2d}|j|}|j|jd|dS(sGA real XHTML document should come out *exactly* the same as it went in.s Hello. Goodbye. sutf-8N(RRRW(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyRYscCs/d}|j|}|j||jdS(Ns (RRRW(R tdocR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_nested_namespacesscCsDd}t|d}d|j_|j}|jd|kdS(Ns/ slxml-xmlsconsole.log("< < hey > > ");s< < hey > >(RRgR}RWRd(R RRtencoded((s//usr/lib/python2.7/site-packages/bs4/testing.pyt5test_formatter_processes_script_tag_for_xml_documentss   cCs/d}|j|}|jd|jjdS(Nu?Sacré bleu!u Sacré bleu!(RRtrootR}(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyRscCs2d}|j|}|jt|j|dS(Nsb2012-07-02T20:33:42Zcd(RRtunicodetrss(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_popping_namespaced_tagscCs,|jd}|j|jdddS(Nstlatin1s/ (RRRW(R R((s//usr/lib/python2.7/site-packages/bs4/testing.pyt(test_docstring_includes_correct_encodings cCs>dddd}|j|}|j|jd|dS( s<A large XML document should come out the same as it went in.s- t0ii ssutf-8Ni(RRRW(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_large_xml_documentscCs!|jdd|jddS(Ns

s

s

foo

(R(R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyt9test_tags_are_empty_element_if_and_only_if_they_are_emptyscCsJd}|j|}|j}|jd|d|jd|ddS(NsThis tag is in the a namespaceThis tag is in the b namespaceshttp://example.com/sxmlns:ashttp://example.net/sxmlns:b(RRR(R RRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_namespaces_are_preserveds  cCs2d}|j|}|jt|j|dS(NsN

20010504

(RRRRJ(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_closing_namespaced_tagscCs2d}|j|}|jt|j|dS(Nss(RRRRE(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_namespaced_attributesscCs2d}|j|}|jt|j|dS(Nsbar(RRRRE(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt(test_namespaced_attributes_xml_namespacescCsd}|j|}|jdt|jd|jdt|jd|jdt|jd|jdt|jddd |jdt|jddgdS( Ns foo bar baz ittagisns1:tagisns2:tagtkeytvalue(RRRIRZ(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_find_by_prefixed_names %cCsGd}|j|}|j}tj|}|j|j|jdS(Nsf (RtdocumentR^Rtprefix(R txmlRRt duplicate((s//usr/lib/python2.7/site-packages/bs4/testing.pyt!test_copy_tag_preserves_namespaces  (R!R"RDRRR]RYRRRRRRRRRRRRR(((s//usr/lib/python2.7/site-packages/bs4/testing.pyRjs$            tHTML5TreeBuilderSmokeTestcBs;eZdZdZdZdZdZdZRS(s2Smoke test for a tree builder that supports HTML5.cCsdS(N((R ((s//usr/lib/python2.7/site-packages/bs4/testing.pyRYscCs/d}|j|}|jd|jjdS(Nsshttp://www.w3.org/1999/xhtml(RRRt namespace(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_html_tags_have_namespacescCsKd}|j|}d}|j||jj|j||jjdS(Nsshttp://www.w3.org/2000/svg(RRtsvgRtcircle(R RRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_svg_tags_have_namespace s cCsKd}|j|}d}|j||jj|j||jjdS(Ns5s"http://www.w3.org/1998/Math/MathML(RRtmathRtmsqrt(R RRR((s//usr/lib/python2.7/site-packages/bs4/testing.pyttest_mathml_tags_have_namespaces cCsjd}|j|}|jt|jdt|j|jdd|jd|jdjjdS(Ns3is$?xml version="1.0" encoding="utf-8"?RO(RRdRRGRRRR;(R RR((s//usr/lib/python2.7/site-packages/bs4/testing.pyt$test_xml_declaration_becomes_comments (R!R"RRYRRRR(((s//usr/lib/python2.7/site-packages/bs4/testing.pyRs     csdfd}|S(Nc_sdS(N(R(ttesttargsR((s//usr/lib/python2.7/site-packages/bs4/testing.pytnothing!scsr S|SdS(N((t test_item(t conditionR(s//usr/lib/python2.7/site-packages/bs4/testing.pyt decorator$s((RtreasonR((RRs//usr/lib/python2.7/site-packages/bs4/testing.pytskipIf s (Rt __license__R=R^t functoolstunittestRtbs4Rt bs4.elementRRRRRt bs4.builderRR R tobjectR$RRR(((s//usr/lib/python2.7/site-packages/bs4/testing.pyts"    (%-#