Pregunta

Quiero una expresión regular para extraer el título de una página HTML. Actualmente tengo esto:

title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
    title = title.replace('<title>', '').replace('</title>', '') 

¿Hay una expresión regular para extraer sólo el contenido de por lo que no tenga que quitar las etiquetas? </P> </div> </div> </div> <div id="boxRight" class="tab-content col-xl-6"> <div id="boxSoluzioneDescrizione" class="boxArticolo"> <div class="row"> <div class="col-md-6"> <div class="row justify-content-start"> <div class="col-md-12"> <form id="feedback" action="/es/articolo/feedback" method="post"> <input type="hidden" name="_csrf" value="EgZ7Xr_oKQO8_NM71edRI_NO-oKQpGHC7dh6yIPe0jpeVg00_I5OT_Gy4Fqd1h5zuR2Lz6b1VLfasRCFyKqxWA=="> <div class="hidden" style="display:none;"> <div class="form-group field-feedbackform-pagina required"> <input type="hidden" id="feedbackform-pagina" class="pagina" name="FeedbackForm[pagina]" value="/articolo/details"> <p class="help-block help-block-error"></p> </div> <div class="form-group field-feedbackform-idargomento"> <input type="hidden" id="feedbackform-idargomento" class="idArgomento" name="FeedbackForm[idArgomento]" value="374591"> <p class="help-block help-block-error"></p> </div> </div> <div> ¿Fue útil? <div class="example-block text-center"> <label class="radio-inline" for="happy" style="font-size:1.5em;cursor:pointer;color:green;"> <i class="far fa-thumbs-up" title="This answer is useful"></i> <!-- fas per effetto mano piena --> <!--<img class="votoImg" src="https://img.icons8.com/color/100/000000/bored.png" width="84" height="84" loading="lazy" fetchpriority="high"> --> </label> <input type="radio" id="happy" class="voto input-hidden" name="FeedbackForm[voto]" value="10"> </div> <div class="example-block text-center"> <label class="radio-inline" for="sad" style="font-size:1.5em;cursor:pointer;color:red;"> <i class="far fa-thumbs-down" title="This answer is not useful"></i> <!-- fas per effetto mano piena --> <!--<img class="votoImg" src="https://img.icons8.com/color/100/000000/boring.png" width="84" height="84" loading="lazy" fetchpriority="high">--> </label> <input type="radio" id="sad" class="voto input-hidden" name="FeedbackForm[voto]" value="0"> </div> <!--<div class="col-auto example-block text-center"> <label class="radio-inline"> <input type="radio" name="voto" id="exicetd" class="input-hidden" /> <img class="votoImg" src="https://img.icons8.com/color/100/000000/smiling.png " width="84" height="84" loading="lazy" fetchpriority="high"> </label> </div>--> </div> <div class="row footer justify-content-between"> <div class="col"> <button type="button" class="btn btn-primary" data-dismiss="modal">Enviar</button> </div> </div> </form> </div> </div> </div> <div class="col-md-6"> </div> </div> <div class="row "> <div class="col-md-12"> <p class="title" style="background-color:green;"> <i class="far fa-thumbs-up"></i> Solución </p> <div class="testo"> <P> <code>(</code> Uso de expresiones regulares y <code>)</code> en <a href="https://docs.python.org/2/library/re.html#re.MatchObject.group" rel="noreferrer"> <code>group(1)</code> </a> en Python para recuperar la cadena capturado (<a href="https://docs.python.org/2/library/re.html#re.search" rel="noreferrer"> <code>re.search</code> </a> volverá <code>None</code> si no encuentra el resultado, por lo que <em> no utilice directamente <code>group()</code> </em>): </p> <pre><code>title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE) if title_search: title = title_search.group(1) </code></pre> </div> </div> </div> </div> </div> </div> <div class="row mt-4 adv"> <div class="col-12 text-center"> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5108424997424987" data-ad-slot="1879801491"></ins> <script defer async crossorigin="anonymous"> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="row mt-4 adv"> <div class="col-12 text-center"> </div> </div> <div class="row mt-4"> <div class="col-12"> <div id="boxSoluzioniAvanzate" class="boxArticolo soluzioni"> <p class="title" style="background-color:black;"><i class="fas fa-file-alt"></i> Otros consejos</p> <div class="testo"> <div id="alt1490811" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> Trate de usar grupos de captura: </p> <pre><code>title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) </code></pre> </div> </div> <div id="alt1490812" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> Tenga en cuenta que a partir <code>Python 3.8</code>, y la introducción de <a href="https://www.python.org/dev/peps/pep-0572/" expresiones de asignación rel="noreferrer"> (PEP 572) </a> (operador <code>:=</code>), es posible mejorar un poco en la solución de <a href="https://stackoverflow.com/a/1327389/9297144"> Krzysztof Krason </a> capturando directamente el resultado del partido en el caso condición como una variable y volver a usarlo en el cuerpo de la condición: </p> <pre><code># pattern = '<title>(.*)</title>' # text = '<title>hello</title>' if match := re.search(pattern, text, re.IGNORECASE): title = match.group(1) # hello </code></pre> </div> </div> <div id="alt1490813" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> <code>re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)</code> </p> </div> </div> <div id="alt1490814" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> Las piezas proporcionadas de código de no hacer frente a <code>Exceptions</code> ¿Puedo sugerir </p> <pre><code>getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0] </code></pre> <P> Esto devuelve una cadena vacía por defecto si el patrón no se ha encontrado, o el primer partido. </P> </div> </div> <div id="alt1490815" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> Probar: </p> <pre><code>title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) </code></pre> </div> </div> <div id="alt1490816" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> ¿Puedo recomendar a sopa de Hermosa. La sopa es un muy buen lib para analizar la totalidad de su documento HTML. </P> <pre><code>soup = BeatifulSoup(html_doc) titleName = soup.title.name </code></pre> </div> </div> <div id="alt1490817" class="boxBorderTop row noMargin pt-4"> <div class="col-md-12 text-left"> <i class="far fa-newspaper fa-2x mb-2" style="display:block;color:gray;"></i> </div> <div class="col-md-12"> <P> pensaría que esto debería ser suficiente: </p> <pre><code>#!python import re pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE) pattern.search(text) </code></pre> <P> ... suponiendo que su texto (HTML) está en una variable llamada "texto". </P> <P> Esto también supone que no hay otras etiquetas HTML que se pueden incrustar legalmente dentro de una etiqueta de título HTML y no hay manera de integrar legalmente cualquier otra <carácter dentro de un contenedor / bloque de este tipo. </P> <P> <strong> Sin embargo </strong> ... </p> <P> No utilice expresiones regulares para análisis de HTML en Python. Utilizar un analizador de HTML! (A menos que usted va a escribir un analizador completo, lo que sería un trabajo extra cuando varios HTML, SGML y XML analizadores ya están en las bibliotecas estándar. </P> <P> Si su manejo "mundo real" <strong> etiqueta de la sopa </strong> HTML (que es frecuente que no corresponden a ninguna de validación SGML / XML) es válida la <a href = "https: //www.crummy. com / software / BeautifulSoup /" rel = "nofollow noreferrer"> BeautifulSoup </a> paquete. No está en las librerías estándar (aún), pero se recomienda amplia para este propósito. </P> <P> Otra opción es: <a href="http://lxml.de/" rel="nofollow noreferrer"> lxml </a> ... que está escrito para correctamente estructurados (normas conformes) HTML. Pero tiene una opción para replegará para usar como un analizador BeautifulSoup:. <a href="http://lxml.de/elementsoup.html" rel="nofollow noreferrer"> ElementSoup </a> </p> </div> </div> </div> </div> </div> </div> <div class="row mt-4"> <div class="col-12"> <div class="attribution"> <div>Licenciado bajo: <a href="https://creativecommons.org/licenses/by-sa/3.0/" target="_blank">CC-BY-SA</a> con <a href="https://stackoverflow.blog/2009/06/25/attribution-required/" target="_blank">atribución</a></div> <div>No afiliado a <a href="https://stackoverflow.com/" target="_blank">StackOverflow</a></div> </div> </div> </div> <div id="share"></div> </div> <div class="row mb-4 adv"> <div class="col-md-12 text-center"> <!-- GeneraCodice - Footer pagina --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5108424997424987" data-ad-slot="5412049179" data-ad-format="auto" data-full-width-responsive="true"></ins> <script defer async crossorigin="anonymous"> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> </div> <aside id="bannerRight" class="col-xs-12 col-md-4 col-lg-3 text-center" > <div class="container mt-4"> <div class="row mb-4 adv"> <div class="col-md-12"> <!-- GeneraCodice - Barra laterale --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5108424997424987" data-ad-slot="1592207755" data-ad-format="auto" data-full-width-responsive="true"></ins> <script defer async crossorigin="anonymous"> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="row adv"> <div class="col-md-12"> <!-- GeneraCodice - Barra laterale 2 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5108424997424987" data-ad-slot="8889943968" data-ad-format="auto" data-full-width-responsive="true"></ins> <script defer async crossorigin="anonymous"> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="row topArticoli justify-content-center"> <div class="col-md-12 col-lg-10 pt-4"> </div> </div> </div> </aside> </div> </section> <!-- DA INSERIRE COLLEGAMENTO A GENERANEWS E GRATISFORGRATIS.COM --> <footer class="site-footer"> <div class="section-free d-block d-md-flex"> <div class="section-newsletter col"> </div> <div class="col content-free-projects mb-2"> <div> <p class="my-3">Enlaces útiles</p> </div> <div class="d-flex justify-content-around"> <div></div> <div> <a class="nav-link" href="https://www.generacodice.com/es/tag">Etiquetas</a> <a class="nav-link" href="https://www.generacodice.com/es/site/aboutus">Sobre nosotros</a> <a class="nav-link" href="https://www.generacodice.com/es/site/contacts">Contactos</a> <a class="nav-link" href="https://www.generacodice.com/es/site/privacy">Privacidad</a> </div> <div> <a class="nav-link social fb" href="https://www.facebook.com/generacodice" target="_blank"><i class="fab fa-facebook"></i> Facebook</a> <a class="nav-link social instagram" href="https://www.instagram.com/genera_codice" target="_blank"><i class="fab fa-instagram"></i> Instagram</a> </div> <div></div> </div> <div class="small-footer-link d-flex align-items-center justify-content-center"> <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"> <input type="hidden" name="cmd" value="_s-xclick" /> <input type="hidden" name="hosted_button_id" value="42ZKUPRLM66J2" /> <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button" /> </form> </div> </div> </div> <div class="row m-0 justify-content-center text-center p-2"> <div class="col-md-5"> <p>El contenido tiene licencia bajo Creative Commons.</p> <p class="mb-0">Si encuentra violaciones de derechos de autor, puede contactarnos en <a href="mailto:info@generacodice.com"> info@generacodice.com </a> Para solicitar la eliminación del contenido.</p> </div> </div> </footer> <div id="scroll-to-top" style="display: block;background:none;"> <img src="https://www.generacodice.com/img/icone/scroll-top.svg" alt="scroll top" style="width:48px;height:48px;background-color:#fff;" /> </div> <!-- Google Analytics --> <!-- Google tag (gtag.js) --> <script src="https://www.googletagmanager.com/gtag/js?id=G-PNYLV6VWJG" async crossorigin="anonymous"></script> <script crossorigin="anonymous" defer> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-PNYLV6VWJG'); </script> <!-- Visualizzare barra ricerca su google --> <script type="application/ld+json" crossorigin="anonymous"> { "@context": "https://schema.org", "@type": "WebSite", "url": "https://www.generacodice.com/", "potentialAction": { "@type": "SearchAction", "target": "https://www.generacodice.com/articolo?ricerca={search_term_string}", "query-input": "required name=search_term_string" } } </script> <!-- Yandex.Metrika counter <script type="text/javascript" defer crossorigin="anonymous"> (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(79291009, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/79291009" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script>var lingua = "https://www.generacodice.com/es";</script> <script src="/lib/wow.min.js" preload></script> <script src="/lib/js.cookie.min.js" preload></script> <script src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js?customize=1&tracking=1&thirdparty=1&always=1&noGeoIp=1&showNoConsent=1&showPolicyLink=1&privacyPage=https%3A%2F%2Fwww.generacodice.com%2Fsite%2Fprivacy" preload></script> <script src="/js/form_ricerca.js" preload></script> <script src="https://kit.fontawesome.com/99a60a9345.js" preload></script> <script src="/js/ads.js" defer="defer" preload></script> <script src="/js/main.js?timestamp=20221207" defer="defer" preload></script> <script src="/assets/44258436/yii.js"></script> <script src="/assets/44258436/yii.validation.js"></script> <script src="/assets/44258436/yii.activeForm.js"></script> <script src="/js/feedback.js" defer></script> <script src="/js/articulate.min.js"></script> <script src="/js/playerTesto.js?202310021220"></script> <script src="/lib/jssocials/jssocials.min.js"></script> <script src="/js/sceditor/minified/sceditor.min.js"></script> <script src="/js/sceditor/minified/formats/xhtml.js"></script> <script src="/js/articolo/details.js?202309292139"></script> <script>jQuery(function ($) { jQuery('#feedback').yiiActiveForm([{"id":"feedbackform-pagina","name":"pagina","container":".field-feedbackform-pagina","input":"#feedbackform-pagina","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Pagina no puede estar vacío."});}},{"id":"feedbackform-idargomento","name":"idArgomento","container":".field-feedbackform-idargomento","input":"#feedbackform-idargomento","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.number(value, messages, {"pattern":/^[+-]?\d+$/,"message":"Id Argomento debe ser un número entero.","skipOnEmpty":1});}}], []); jQuery('#w0').yiiActiveForm([], []); });</script> <script> window.addEventListener('load', function() { var is_adsense_load = 0 window.addEventListener('scroll', function() { if (is_adsense_load == 0) { is_adsense_load = 1; var ele = document.createElement('script'); ele.async = true; ele.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js' var sc = document.getElementsByTagName('script')[0] sc.parentNode.insertBefore(ele, sc); (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-5108424997424987", enable_page_level_ads: true }); } }) }) </script> </body> </html>