web-dev-qa-db-fra.com

Comment utiliser Beautiful Soup pour extraire la chaîne dans la balise <script>?

Dans une page .html donnée, j'ai une balise de script comme ceci:

     <script>jQuery(window).load(function () {
  setTimeout(function(){
    jQuery("input[name=Email]").val("[email protected]");
  }, 1000);
});</script>

Comment puis-je utiliser Beautiful Soup pour extraire l'adresse e-mail?

9
dundonian

Pour ajouter un peu plus à @ la réponse de Bob et en supposant que vous devez également localiser la balise script dans le HTML qui peut avoir d'autres balises script.

L'idée est de définir une expression régulière qui serait utilisée à la fois localiser l'élément avec BeautifulSoup et extraire la valeur email:

import re

from bs4 import BeautifulSoup


data = """
<body>
    <script>jQuery(window).load(function () {
      setTimeout(function(){
        jQuery("input[name=Email]").val("[email protected]");
      }, 1000);
    });</script>
</body>
"""
pattern = re.compile(r'\.val\("([^@]+@[^@]+\.[^@]+)"\);', re.MULTILINE | re.DOTALL)
soup = BeautifulSoup(data, "html.parser")

script = soup.find("script", text=pattern)
if script:
    match = pattern.search(script.text)
    if match:
        email = match.group(1)
        print(email)

Impressions: [email protected].

Ici, nous utilisons un expression régulière simple pour l'adresse e-mail , mais nous pouvons aller plus loin et être plus stricts, mais je doute que ce soit pratiquement nécessaire pour ce problème.

11
alecxe

pas possible en utilisant seulement BeautifulSoup, mais vous pouvez le faire par exemple avec des expressions régulières BS +

import re
from bs4 import BeautifulSoup as BS

html = """<script> ... </script>"""

bs = BS(html)

txt = bs.script.get_text()

email = re.match(r'.+val\("(.+?)"\);', txt).group(1)

ou comme ça:

...

email = txt.split('.val("')[1].split('");')[0]
4
Bob