Domanda

Voglio un'espressione regolare per estrarre il titolo da una pagina HTML. Attualmente ho questo:

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

C'è un'espressione regolare per estrarre solo il contenuto di quindi non c'è bisogno di rimuovere i tag? </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="/it/articolo/feedback" method="post"> <input type="hidden" name="_csrf" value="pbm9cjNv_SMriieWc3dzbt_uO3qiyRyBGjoNFlmmnq3u9f4iWzyfbBzlH6E5OTxWmqRuF9CLXd5NT0p5GPHVxQ=="> <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> È stato utile? <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">Invia</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> Soluzione </p> <div class="testo"> <P> <code>(</code> Usa <code>)</code> in regexp e <a href="https://docs.python.org/2/library/re.html#re.MatchObject.group" rel="noreferrer"> <code>group(1)</code> </a> python per recuperare la stringa catturata (<a href="https://docs.python.org/2/library/re.html#re.search" rel="noreferrer"> <code>re.search</code> </a> tornerà <code>None</code> se non trova il risultato, in modo da <em> non utilizzare <code>group()</code> direttamente </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> Altri suggerimenti</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> Provare a utilizzare gruppi di cattura: </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> Si noti che a partire <code>Python 3.8</code>, e l'introduzione di <a href="https://www.python.org/dev/peps/pep-0572/" espressioni di assegnamento rel="noreferrer"> (PEP 572) </a> (operatore <code>:=</code>), è possibile migliorare un po 'la soluzione di <a href="https://stackoverflow.com/a/1327389/9297144"> Krzysztof Krason </a> catturando il risultato della partita direttamente all'interno del caso condizione come variabile e riutilizzarlo nel corpo della condizione: </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> I pezzi forniti di codice non affrontare <code>Exceptions</code> Posso suggerire </p> <pre><code>getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0] </code></pre> <P> Questo restituisce una stringa vuota per impostazione predefinita se non è stato trovato il modello, o la prima partita. </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> Prova: </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> Posso raccomandare a Beautiful Soup. Zuppa è un ottimo lib per analizzare tutto il vostro 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> Mi piacerebbe che questo dovrebbe essere sufficiente: </p> <pre><code>#!python import re pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE) pattern.search(text) </code></pre> <P> ... supponendo che il testo (HTML) è in una variabile denominata "testo". </P> <P> Questo presuppone anche che non ci sono altri tag HTML che possono essere legalmente incorporato all'interno di un tag HTML TITLE e non c'è modo per incorporare legalmente ogni altra <carattere all'interno di un tale contenitore / blocco. </P> <P> <strong> Tuttavia </strong> ... </p> <P> Non usare le espressioni regolari per l'analisi HTML in Python. Utilizzare un parser HTML! (A meno che non hai intenzione di scrivere un parser completo, che sarebbe un lavoro extra quando vari HTML, SGML e XML parser sono già nelle librerie standard. </P> <P> Se la movimentazione "mondo reale" <strong> tag zuppa </strong> HTML (che spesso non conformi a qualsiasi validatore SGML / XML) quindi utilizzare il <a href = "https: //www.crummy. com / software / BeautifulSoup /" rel = "nofollow noreferrer"> BeautifulSoup </a> pacchetto. Non è nelle librerie standard (ancora), ma è larga consigliato per questo scopo. </P> <P> Un'altra opzione è: <a href="http://lxml.de/" rel="nofollow noreferrer"> lxml </a> ... che è scritto adeguatamente strutturati (standard conforme) HTML. Ma ha la possibilità di fallback per utilizzare BeautifulSoup come un parser:. <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>Autorizzato sotto: <a href="https://creativecommons.org/licenses/by-sa/3.0/" target="_blank">CC-BY-SA</a> insieme a <a href="https://stackoverflow.blog/2009/06/25/attribution-required/" target="_blank">attribuzione</a></div> <div>Non affiliato 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"> <a href="https://www.psicocultura.it" title="Psicocultura - Psicologia a portata di click" target="_blank"> <img src="/img/banner/Psicocultura_300x300.webp" alt="Banner psicocultura" style="width:300px;height:300px;" loading="lazy" /> </a> </div> </div> <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">Link utili</p> </div> <div class="d-flex justify-content-around"> <div></div> <div> <a class="nav-link" href="https://www.generacodice.com/it/tag">Tag</a> <a class="nav-link" href="https://www.generacodice.com/it/site/aboutus">Chi siamo</a> <a class="nav-link" href="https://www.generacodice.com/it/site/contacts">Contatti</a> <a class="nav-link" href="https://www.generacodice.com/it/site/privacy">Privacy</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>I contenuti sono concessi in licenza ai sensi della Creative Commons.</p> <p class="mb-0">Se trovi violazioni del copyright, puoi contattarci a <a href="mailto:info@generacodice.com"> info@generacodice.com </a> per richiedere la rimozione del contenuto.</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/it";</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 non può essere vuoto."});}},{"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 deve essere un numero intero.","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>