4 <html class="writer-html5" lang="en" >
8 <meta name="viewport" content="width=device-width, initial-scale=1.0">
10 <title>lxml.html.formfill — lxml documentation</title>
14 <link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
15 <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
24 <script src="../../../_static/js/html5shiv.min.js"></script>
28 <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
29 <script src="../../../_static/jquery.js"></script>
30 <script src="../../../_static/underscore.js"></script>
31 <script src="../../../_static/doctools.js"></script>
32 <script src="../../../_static/language_data.js"></script>
34 <script type="text/javascript" src="../../../_static/js/theme.js"></script>
37 <link rel="index" title="Index" href="../../../genindex.html" />
38 <link rel="search" title="Search" href="../../../search.html" />
41 <body class="wy-body-for-nav">
44 <div class="wy-grid-for-nav">
46 <nav data-toggle="wy-nav-shift" class="wy-nav-side">
47 <div class="wy-side-scroll">
48 <div class="wy-side-nav-search" >
52 <a href="../../../index.html" class="icon icon-home" alt="Documentation Home"> lxml
57 <img src="../../../_static/python-xml.png" class="logo" alt="Logo"/>
72 <form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
73 <input type="text" name="q" placeholder="Search docs" />
74 <input type="hidden" name="check_keywords" value="yes" />
75 <input type="hidden" name="area" value="default" />
83 <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
91 <li class="toctree-l1"><a class="reference internal" href="../../../lxml.html">lxml package</a><ul>
92 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.html.html">lxml.html package</a><ul>
93 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.ElementSoup.html">lxml.html.ElementSoup module</a></li>
94 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html._diffcommand.html">lxml.html._diffcommand module</a></li>
95 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html._setmixin.html">lxml.html._setmixin module</a></li>
96 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.builder.html">lxml.html.builder module</a></li>
97 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.clean.html">lxml.html.clean module</a></li>
98 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.defs.html">lxml.html.defs module</a></li>
99 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.diff.html">lxml.html.diff module</a></li>
100 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.formfill.html">lxml.html.formfill module</a></li>
101 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.html5parser.html">lxml.html.html5parser module</a></li>
102 <li class="toctree-l3"><a class="reference internal" href="../../../lxml.html.soupparser.html">lxml.html.soupparser module</a></li>
105 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.isoschematron.html">lxml.isoschematron package</a></li>
106 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.ElementInclude.html">lxml.ElementInclude module</a></li>
107 <li class="toctree-l2"><a class="reference internal" href="../../../lxml._elementpath.html">lxml._elementpath module</a></li>
108 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.builder.html">lxml.builder module</a></li>
109 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.cssselect.html">lxml.cssselect module</a></li>
110 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.doctestcompare.html">lxml.doctestcompare module</a></li>
111 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.etree.html">lxml.etree module</a></li>
112 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.objectify.html">lxml.objectify module</a></li>
113 <li class="toctree-l2"><a class="reference internal" href="../../../lxml.sax.html">lxml.sax module</a></li>
125 <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
128 <nav class="wy-nav-top" aria-label="top navigation">
130 <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
131 <a href="../../../index.html">lxml</a>
136 <div class="wy-nav-content">
138 <div class="rst-content">
156 <div role="navigation" aria-label="breadcrumbs navigation">
158 <ul class="wy-breadcrumbs">
160 <li><a href="../../../index.html" class="icon icon-home"></a> »</li>
162 <li><a href="../../index.html">Module code</a> »</li>
164 <li><a href="../../lxml.html">lxml</a> »</li>
166 <li><a href="../html.html">lxml.html</a> »</li>
168 <li>lxml.html.formfill</li>
171 <li class="wy-breadcrumbs-aside">
180 <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
181 <div itemprop="articleBody">
183 <h1>Source code for lxml.html.formfill</h1><div class="highlight"><pre>
184 <span></span><span class="kn">from</span> <span class="nn">lxml.etree</span> <span class="kn">import</span> <span class="n">XPath</span><span class="p">,</span> <span class="n">ElementBase</span>
185 <span class="kn">from</span> <span class="nn">lxml.html</span> <span class="kn">import</span> <span class="n">fromstring</span><span class="p">,</span> <span class="n">XHTML_NAMESPACE</span>
186 <span class="kn">from</span> <span class="nn">lxml.html</span> <span class="kn">import</span> <span class="n">_forms_xpath</span><span class="p">,</span> <span class="n">_options_xpath</span><span class="p">,</span> <span class="n">_nons</span><span class="p">,</span> <span class="n">_transform_result</span>
187 <span class="kn">from</span> <span class="nn">lxml.html</span> <span class="kn">import</span> <span class="n">defs</span>
188 <span class="kn">import</span> <span class="nn">copy</span>
190 <span class="k">try</span><span class="p">:</span>
191 <span class="n">basestring</span>
192 <span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
193 <span class="c1"># Python 3</span>
194 <span class="n">basestring</span> <span class="o">=</span> <span class="nb">str</span>
196 <span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'FormNotFound'</span><span class="p">,</span> <span class="s1">'fill_form'</span><span class="p">,</span> <span class="s1">'fill_form_html'</span><span class="p">,</span>
197 <span class="s1">'insert_errors'</span><span class="p">,</span> <span class="s1">'insert_errors_html'</span><span class="p">,</span>
198 <span class="s1">'DefaultErrorCreator'</span><span class="p">]</span>
200 <div class="viewcode-block" id="FormNotFound"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.FormNotFound">[docs]</a><span class="k">class</span> <span class="nc">FormNotFound</span><span class="p">(</span><span class="ne">LookupError</span><span class="p">):</span>
201 <span class="sd">"""</span>
202 <span class="sd"> Raised when no form can be found</span>
203 <span class="sd"> """</span></div>
205 <span class="n">_form_name_xpath</span> <span class="o">=</span> <span class="n">XPath</span><span class="p">(</span><span class="s1">'descendant-or-self::form[name=$name]|descendant-or-self::x:form[name=$name]'</span><span class="p">,</span> <span class="n">namespaces</span><span class="o">=</span><span class="p">{</span><span class="s1">'x'</span><span class="p">:</span><span class="n">XHTML_NAMESPACE</span><span class="p">})</span>
206 <span class="n">_input_xpath</span> <span class="o">=</span> <span class="n">XPath</span><span class="p">(</span><span class="s1">'|'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'descendant-or-self::'</span><span class="o">+</span><span class="n">_tag</span> <span class="k">for</span> <span class="n">_tag</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'input'</span><span class="p">,</span><span class="s1">'select'</span><span class="p">,</span><span class="s1">'textarea'</span><span class="p">,</span><span class="s1">'x:input'</span><span class="p">,</span><span class="s1">'x:select'</span><span class="p">,</span><span class="s1">'x:textarea'</span><span class="p">)]),</span>
207 <span class="n">namespaces</span><span class="o">=</span><span class="p">{</span><span class="s1">'x'</span><span class="p">:</span><span class="n">XHTML_NAMESPACE</span><span class="p">})</span>
208 <span class="n">_label_for_xpath</span> <span class="o">=</span> <span class="n">XPath</span><span class="p">(</span><span class="s1">'//label[@for=$for_id]|//x:label[@for=$for_id]'</span><span class="p">,</span>
209 <span class="n">namespaces</span><span class="o">=</span><span class="p">{</span><span class="s1">'x'</span><span class="p">:</span><span class="n">XHTML_NAMESPACE</span><span class="p">})</span>
210 <span class="n">_name_xpath</span> <span class="o">=</span> <span class="n">XPath</span><span class="p">(</span><span class="s1">'descendant-or-self::*[@name=$name]'</span><span class="p">)</span>
212 <div class="viewcode-block" id="fill_form"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.fill_form">[docs]</a><span class="k">def</span> <span class="nf">fill_form</span><span class="p">(</span>
213 <span class="n">el</span><span class="p">,</span>
214 <span class="n">values</span><span class="p">,</span>
215 <span class="n">form_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
216 <span class="n">form_index</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
217 <span class="p">):</span>
218 <span class="n">el</span> <span class="o">=</span> <span class="n">_find_form</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">form_id</span><span class="o">=</span><span class="n">form_id</span><span class="p">,</span> <span class="n">form_index</span><span class="o">=</span><span class="n">form_index</span><span class="p">)</span>
219 <span class="n">_fill_form</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span></div>
221 <div class="viewcode-block" id="fill_form_html"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.fill_form_html">[docs]</a><span class="k">def</span> <span class="nf">fill_form_html</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">form_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">form_index</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
222 <span class="n">result_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
223 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
224 <span class="n">doc</span> <span class="o">=</span> <span class="n">fromstring</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
225 <span class="k">else</span><span class="p">:</span>
226 <span class="n">doc</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
227 <span class="n">fill_form</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">form_id</span><span class="o">=</span><span class="n">form_id</span><span class="p">,</span> <span class="n">form_index</span><span class="o">=</span><span class="n">form_index</span><span class="p">)</span>
228 <span class="k">return</span> <span class="n">_transform_result</span><span class="p">(</span><span class="n">result_type</span><span class="p">,</span> <span class="n">doc</span><span class="p">)</span></div>
230 <div class="viewcode-block" id="_fill_form"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._fill_form">[docs]</a><span class="k">def</span> <span class="nf">_fill_form</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
231 <span class="n">counts</span> <span class="o">=</span> <span class="p">{}</span>
232 <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="s1">'mixed'</span><span class="p">):</span>
233 <span class="c1"># For Paste request parameters</span>
234 <span class="n">values</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">mixed</span><span class="p">()</span>
235 <span class="n">inputs</span> <span class="o">=</span> <span class="n">_input_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
236 <span class="k">for</span> <span class="nb">input</span> <span class="ow">in</span> <span class="n">inputs</span><span class="p">:</span>
237 <span class="n">name</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span>
238 <span class="k">if</span> <span class="ow">not</span> <span class="n">name</span><span class="p">:</span>
239 <span class="k">continue</span>
240 <span class="k">if</span> <span class="n">_takes_multiple</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
241 <span class="n">value</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="p">[])</span>
242 <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
243 <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
244 <span class="n">_fill_multiple</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
245 <span class="k">elif</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
246 <span class="k">continue</span>
247 <span class="k">else</span><span class="p">:</span>
248 <span class="n">index</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
249 <span class="n">counts</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span>
250 <span class="n">value</span> <span class="o">=</span> <span class="n">values</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
251 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
252 <span class="k">try</span><span class="p">:</span>
253 <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
254 <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
255 <span class="k">continue</span>
256 <span class="k">elif</span> <span class="n">index</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
257 <span class="k">continue</span>
258 <span class="n">_fill_single</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
260 <div class="viewcode-block" id="_takes_multiple"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._takes_multiple">[docs]</a><span class="k">def</span> <span class="nf">_takes_multiple</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
261 <span class="k">if</span> <span class="n">_nons</span><span class="p">(</span><span class="nb">input</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'select'</span> <span class="ow">and</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'multiple'</span><span class="p">):</span>
262 <span class="c1"># FIXME: multiple="0"?</span>
263 <span class="k">return</span> <span class="kc">True</span>
264 <span class="nb">type</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'type'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
265 <span class="k">if</span> <span class="nb">type</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'radio'</span><span class="p">,</span> <span class="s1">'checkbox'</span><span class="p">):</span>
266 <span class="k">return</span> <span class="kc">True</span>
267 <span class="k">return</span> <span class="kc">False</span></div>
269 <div class="viewcode-block" id="_fill_multiple"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._fill_multiple">[docs]</a><span class="k">def</span> <span class="nf">_fill_multiple</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
270 <span class="nb">type</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'type'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
271 <span class="k">if</span> <span class="nb">type</span> <span class="o">==</span> <span class="s1">'checkbox'</span><span class="p">:</span>
272 <span class="n">v</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'value'</span><span class="p">)</span>
273 <span class="k">if</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
274 <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span>
275 <span class="n">result</span> <span class="o">=</span> <span class="kc">False</span>
276 <span class="k">else</span><span class="p">:</span>
277 <span class="n">result</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
278 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
279 <span class="c1"># The only valid "on" value for an unnamed checkbox is 'on'</span>
280 <span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="o">==</span> <span class="s1">'on'</span>
281 <span class="n">_check</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
282 <span class="k">else</span><span class="p">:</span>
283 <span class="n">_check</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span>
284 <span class="k">elif</span> <span class="nb">type</span> <span class="o">==</span> <span class="s1">'radio'</span><span class="p">:</span>
285 <span class="n">v</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'value'</span><span class="p">)</span>
286 <span class="n">_check</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span>
287 <span class="k">else</span><span class="p">:</span>
288 <span class="k">assert</span> <span class="n">_nons</span><span class="p">(</span><span class="nb">input</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'select'</span>
289 <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">_options_xpath</span><span class="p">(</span><span class="nb">input</span><span class="p">):</span>
290 <span class="n">v</span> <span class="o">=</span> <span class="n">option</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'value'</span><span class="p">)</span>
291 <span class="k">if</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
292 <span class="c1"># This seems to be the default, at least on IE</span>
293 <span class="c1"># FIXME: but I'm not sure</span>
294 <span class="n">v</span> <span class="o">=</span> <span class="n">option</span><span class="o">.</span><span class="n">text_content</span><span class="p">()</span>
295 <span class="n">_select</span><span class="p">(</span><span class="n">option</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span></div>
297 <div class="viewcode-block" id="_check"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._check">[docs]</a><span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">check</span><span class="p">):</span>
298 <span class="k">if</span> <span class="n">check</span><span class="p">:</span>
299 <span class="n">el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'checked'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
300 <span class="k">else</span><span class="p">:</span>
301 <span class="k">if</span> <span class="s1">'checked'</span> <span class="ow">in</span> <span class="n">el</span><span class="o">.</span><span class="n">attrib</span><span class="p">:</span>
302 <span class="k">del</span> <span class="n">el</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="s1">'checked'</span><span class="p">]</span></div>
304 <div class="viewcode-block" id="_select"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._select">[docs]</a><span class="k">def</span> <span class="nf">_select</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">select</span><span class="p">):</span>
305 <span class="k">if</span> <span class="n">select</span><span class="p">:</span>
306 <span class="n">el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'selected'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
307 <span class="k">else</span><span class="p">:</span>
308 <span class="k">if</span> <span class="s1">'selected'</span> <span class="ow">in</span> <span class="n">el</span><span class="o">.</span><span class="n">attrib</span><span class="p">:</span>
309 <span class="k">del</span> <span class="n">el</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="s1">'selected'</span><span class="p">]</span></div>
311 <div class="viewcode-block" id="_fill_single"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._fill_single">[docs]</a><span class="k">def</span> <span class="nf">_fill_single</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
312 <span class="k">if</span> <span class="n">_nons</span><span class="p">(</span><span class="nb">input</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'textarea'</span><span class="p">:</span>
313 <span class="nb">input</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">value</span>
314 <span class="k">else</span><span class="p">:</span>
315 <span class="nb">input</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'value'</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
317 <div class="viewcode-block" id="_find_form"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._find_form">[docs]</a><span class="k">def</span> <span class="nf">_find_form</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">form_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">form_index</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
318 <span class="k">if</span> <span class="n">form_id</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">form_index</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
319 <span class="n">forms</span> <span class="o">=</span> <span class="n">_forms_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
320 <span class="k">for</span> <span class="n">form</span> <span class="ow">in</span> <span class="n">forms</span><span class="p">:</span>
321 <span class="k">return</span> <span class="n">form</span>
322 <span class="k">raise</span> <span class="n">FormNotFound</span><span class="p">(</span>
323 <span class="s2">"No forms in page"</span><span class="p">)</span>
324 <span class="k">if</span> <span class="n">form_id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
325 <span class="n">form</span> <span class="o">=</span> <span class="n">el</span><span class="o">.</span><span class="n">get_element_by_id</span><span class="p">(</span><span class="n">form_id</span><span class="p">)</span>
326 <span class="k">if</span> <span class="n">form</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
327 <span class="k">return</span> <span class="n">form</span>
328 <span class="n">forms</span> <span class="o">=</span> <span class="n">_form_name_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">form_id</span><span class="p">)</span>
329 <span class="k">if</span> <span class="n">forms</span><span class="p">:</span>
330 <span class="k">return</span> <span class="n">forms</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
331 <span class="k">else</span><span class="p">:</span>
332 <span class="k">raise</span> <span class="n">FormNotFound</span><span class="p">(</span>
333 <span class="s2">"No form with the name or id of </span><span class="si">%r</span><span class="s2"> (forms: </span><span class="si">%s</span><span class="s2">)"</span>
334 <span class="o">%</span> <span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_find_form_ids</span><span class="p">(</span><span class="n">el</span><span class="p">))))</span>
335 <span class="k">if</span> <span class="n">form_index</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
336 <span class="n">forms</span> <span class="o">=</span> <span class="n">_forms_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
337 <span class="k">try</span><span class="p">:</span>
338 <span class="k">return</span> <span class="n">forms</span><span class="p">[</span><span class="n">form_index</span><span class="p">]</span>
339 <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
340 <span class="k">raise</span> <span class="n">FormNotFound</span><span class="p">(</span>
341 <span class="s2">"There is no form with the index </span><span class="si">%r</span><span class="s2"> (</span><span class="si">%i</span><span class="s2"> forms found)"</span>
342 <span class="o">%</span> <span class="p">(</span><span class="n">form_index</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">forms</span><span class="p">)))</span></div>
344 <div class="viewcode-block" id="_find_form_ids"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._find_form_ids">[docs]</a><span class="k">def</span> <span class="nf">_find_form_ids</span><span class="p">(</span><span class="n">el</span><span class="p">):</span>
345 <span class="n">forms</span> <span class="o">=</span> <span class="n">_forms_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
346 <span class="k">if</span> <span class="ow">not</span> <span class="n">forms</span><span class="p">:</span>
347 <span class="k">yield</span> <span class="s1">'(no forms)'</span>
348 <span class="k">return</span>
349 <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">form</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">forms</span><span class="p">):</span>
350 <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">):</span>
351 <span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">):</span>
352 <span class="k">yield</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> or </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">),</span>
353 <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">))</span>
354 <span class="k">else</span><span class="p">:</span>
355 <span class="k">yield</span> <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">)</span>
356 <span class="k">elif</span> <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">):</span>
357 <span class="k">yield</span> <span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span>
358 <span class="k">else</span><span class="p">:</span>
359 <span class="k">yield</span> <span class="s1">'(unnamed form </span><span class="si">%s</span><span class="s1">)'</span> <span class="o">%</span> <span class="n">index</span></div>
361 <span class="c1">############################################################</span>
362 <span class="c1">## Error filling</span>
363 <span class="c1">############################################################</span>
365 <div class="viewcode-block" id="DefaultErrorCreator"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.DefaultErrorCreator">[docs]</a><span class="k">class</span> <span class="nc">DefaultErrorCreator</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
366 <span class="n">insert_before</span> <span class="o">=</span> <span class="kc">True</span>
367 <span class="n">block_inside</span> <span class="o">=</span> <span class="kc">True</span>
368 <span class="n">error_container_tag</span> <span class="o">=</span> <span class="s1">'div'</span>
369 <span class="n">error_message_class</span> <span class="o">=</span> <span class="s1">'error-message'</span>
370 <span class="n">error_block_class</span> <span class="o">=</span> <span class="s1">'error-block'</span>
371 <span class="n">default_message</span> <span class="o">=</span> <span class="s2">"Invalid"</span>
373 <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
374 <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kw</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
375 <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
376 <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
377 <span class="s2">"Unexpected keyword argument: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
378 <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
380 <span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">el</span><span class="p">,</span> <span class="n">is_block</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
381 <span class="n">error_el</span> <span class="o">=</span> <span class="n">el</span><span class="o">.</span><span class="n">makeelement</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">error_container_tag</span><span class="p">)</span>
382 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_message_class</span><span class="p">:</span>
383 <span class="n">error_el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'class'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_message_class</span><span class="p">)</span>
384 <span class="k">if</span> <span class="n">is_block</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_block_class</span><span class="p">:</span>
385 <span class="n">error_el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'class'</span><span class="p">,</span> <span class="n">error_el</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'class'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span><span class="o">+</span><span class="s1">' '</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">error_block_class</span><span class="p">)</span>
386 <span class="k">if</span> <span class="n">message</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">message</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span>
387 <span class="n">message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_message</span>
388 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ElementBase</span><span class="p">):</span>
389 <span class="n">error_el</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
390 <span class="k">else</span><span class="p">:</span>
391 <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">basestring</span><span class="p">),</span> <span class="p">(</span>
392 <span class="s2">"Bad message; should be a string or element: </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">)</span>
393 <span class="n">error_el</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">message</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_message</span>
394 <span class="k">if</span> <span class="n">is_block</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">block_inside</span><span class="p">:</span>
395 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">insert_before</span><span class="p">:</span>
396 <span class="n">error_el</span><span class="o">.</span><span class="n">tail</span> <span class="o">=</span> <span class="n">el</span><span class="o">.</span><span class="n">text</span>
397 <span class="n">el</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="kc">None</span>
398 <span class="n">el</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">error_el</span><span class="p">)</span>
399 <span class="k">else</span><span class="p">:</span>
400 <span class="n">el</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">error_el</span><span class="p">)</span>
401 <span class="k">else</span><span class="p">:</span>
402 <span class="n">parent</span> <span class="o">=</span> <span class="n">el</span><span class="o">.</span><span class="n">getparent</span><span class="p">()</span>
403 <span class="n">pos</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">el</span><span class="p">)</span>
404 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">insert_before</span><span class="p">:</span>
405 <span class="n">parent</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">error_el</span><span class="p">)</span>
406 <span class="k">else</span><span class="p">:</span>
407 <span class="n">error_el</span><span class="o">.</span><span class="n">tail</span> <span class="o">=</span> <span class="n">el</span><span class="o">.</span><span class="n">tail</span>
408 <span class="n">el</span><span class="o">.</span><span class="n">tail</span> <span class="o">=</span> <span class="kc">None</span>
409 <span class="n">parent</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">pos</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">error_el</span><span class="p">)</span></div>
411 <span class="n">default_error_creator</span> <span class="o">=</span> <span class="n">DefaultErrorCreator</span><span class="p">()</span>
414 <div class="viewcode-block" id="insert_errors"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.insert_errors">[docs]</a><span class="k">def</span> <span class="nf">insert_errors</span><span class="p">(</span>
415 <span class="n">el</span><span class="p">,</span>
416 <span class="n">errors</span><span class="p">,</span>
417 <span class="n">form_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
418 <span class="n">form_index</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
419 <span class="n">error_class</span><span class="o">=</span><span class="s2">"error"</span><span class="p">,</span>
420 <span class="n">error_creator</span><span class="o">=</span><span class="n">default_error_creator</span><span class="p">,</span>
421 <span class="p">):</span>
422 <span class="n">el</span> <span class="o">=</span> <span class="n">_find_form</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">form_id</span><span class="o">=</span><span class="n">form_id</span><span class="p">,</span> <span class="n">form_index</span><span class="o">=</span><span class="n">form_index</span><span class="p">)</span>
423 <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">error</span> <span class="ow">in</span> <span class="n">errors</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
424 <span class="k">if</span> <span class="n">error</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
425 <span class="k">continue</span>
426 <span class="k">for</span> <span class="n">error_el</span><span class="p">,</span> <span class="n">message</span> <span class="ow">in</span> <span class="n">_find_elements_for_name</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">error</span><span class="p">):</span>
427 <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="p">(</span><span class="n">basestring</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="kc">None</span><span class="p">),</span> <span class="n">ElementBase</span><span class="p">)),</span> <span class="p">(</span>
428 <span class="s2">"Bad message: </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">)</span>
429 <span class="n">_insert_error</span><span class="p">(</span><span class="n">error_el</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">error_class</span><span class="p">,</span> <span class="n">error_creator</span><span class="p">)</span></div>
431 <div class="viewcode-block" id="insert_errors_html"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill.insert_errors_html">[docs]</a><span class="k">def</span> <span class="nf">insert_errors_html</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
432 <span class="n">result_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
433 <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
434 <span class="n">doc</span> <span class="o">=</span> <span class="n">fromstring</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
435 <span class="k">else</span><span class="p">:</span>
436 <span class="n">doc</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
437 <span class="n">insert_errors</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
438 <span class="k">return</span> <span class="n">_transform_result</span><span class="p">(</span><span class="n">result_type</span><span class="p">,</span> <span class="n">doc</span><span class="p">)</span></div>
440 <div class="viewcode-block" id="_insert_error"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._insert_error">[docs]</a><span class="k">def</span> <span class="nf">_insert_error</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">error_class</span><span class="p">,</span> <span class="n">error_creator</span><span class="p">):</span>
441 <span class="k">if</span> <span class="n">_nons</span><span class="p">(</span><span class="n">el</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="ow">in</span> <span class="n">defs</span><span class="o">.</span><span class="n">empty_tags</span> <span class="ow">or</span> <span class="n">_nons</span><span class="p">(</span><span class="n">el</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'textarea'</span><span class="p">:</span>
442 <span class="n">is_block</span> <span class="o">=</span> <span class="kc">False</span>
443 <span class="k">else</span><span class="p">:</span>
444 <span class="n">is_block</span> <span class="o">=</span> <span class="kc">True</span>
445 <span class="k">if</span> <span class="n">_nons</span><span class="p">(</span><span class="n">el</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span> <span class="o">!=</span> <span class="s1">'form'</span> <span class="ow">and</span> <span class="n">error_class</span><span class="p">:</span>
446 <span class="n">_add_class</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">error_class</span><span class="p">)</span>
447 <span class="k">if</span> <span class="n">el</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">):</span>
448 <span class="n">labels</span> <span class="o">=</span> <span class="n">_label_for_xpath</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">for_id</span><span class="o">=</span><span class="n">el</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">))</span>
449 <span class="k">if</span> <span class="n">labels</span><span class="p">:</span>
450 <span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">labels</span><span class="p">:</span>
451 <span class="n">_add_class</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">error_class</span><span class="p">)</span>
452 <span class="n">error_creator</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">is_block</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span></div>
454 <div class="viewcode-block" id="_add_class"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._add_class">[docs]</a><span class="k">def</span> <span class="nf">_add_class</span><span class="p">(</span><span class="n">el</span><span class="p">,</span> <span class="n">class_name</span><span class="p">):</span>
455 <span class="k">if</span> <span class="n">el</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'class'</span><span class="p">):</span>
456 <span class="n">el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'class'</span><span class="p">,</span> <span class="n">el</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'class'</span><span class="p">)</span><span class="o">+</span><span class="s1">' '</span><span class="o">+</span><span class="n">class_name</span><span class="p">)</span>
457 <span class="k">else</span><span class="p">:</span>
458 <span class="n">el</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">'class'</span><span class="p">,</span> <span class="n">class_name</span><span class="p">)</span></div>
460 <div class="viewcode-block" id="_find_elements_for_name"><a class="viewcode-back" href="../../../lxml.html.formfill.html#lxml.html.formfill._find_elements_for_name">[docs]</a><span class="k">def</span> <span class="nf">_find_elements_for_name</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">error</span><span class="p">):</span>
461 <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
462 <span class="c1"># An error for the entire form</span>
463 <span class="k">yield</span> <span class="n">form</span><span class="p">,</span> <span class="n">error</span>
464 <span class="k">return</span>
465 <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'#'</span><span class="p">):</span>
466 <span class="c1"># By id</span>
467 <span class="n">el</span> <span class="o">=</span> <span class="n">form</span><span class="o">.</span><span class="n">get_element_by_id</span><span class="p">(</span><span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
468 <span class="k">if</span> <span class="n">el</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
469 <span class="k">yield</span> <span class="n">el</span><span class="p">,</span> <span class="n">error</span>
470 <span class="k">return</span>
471 <span class="n">els</span> <span class="o">=</span> <span class="n">_name_xpath</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
472 <span class="k">if</span> <span class="ow">not</span> <span class="n">els</span><span class="p">:</span>
473 <span class="c1"># FIXME: should this raise an exception?</span>
474 <span class="k">return</span>
475 <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
476 <span class="k">yield</span> <span class="n">els</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">error</span>
477 <span class="k">return</span>
478 <span class="c1"># FIXME: if error is longer than els, should it raise an error?</span>
479 <span class="k">for</span> <span class="n">el</span><span class="p">,</span> <span class="n">err</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">els</span><span class="p">,</span> <span class="n">error</span><span class="p">):</span>
480 <span class="k">if</span> <span class="n">err</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
481 <span class="k">continue</span>
482 <span class="k">yield</span> <span class="n">el</span><span class="p">,</span> <span class="n">err</span></div>
493 <div role="contentinfo">
496 © Copyright 2020, lxml dev team
503 Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
505 <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
507 provided by <a href="https://readthedocs.org">Read the Docs</a>.
519 <script type="text/javascript">
521 SphinxRtdTheme.Navigation.enable(true);