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?
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.
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]