2016-12-23 5 views
2

Ich spiele mit der BeautifulSoup-Bibliothek herum. Ich habe versucht, eine E-Mail von der Website zu analysieren, aber ich habe ein unerwartetes Ergebnis erhalten. Dies ist mein Code:Unerwartetes Ergebnis beim Parsing mit BeautifulSoup und Regex

from urllib.request import urlopen 
from urllib.error import HTTPError 
from urllib.error import URLError 

from bs4 import BeautifulSoup 
import re 
from urllib.parse import quote 

startUrl = "http://getrocketbook.com/pages/returns" 
try: 
    html = urlopen(quote((startUrl).encode('utf8'), ':/?%#_')) 
    bsObj = BeautifulSoup(html, "html.parser") 
    alls = bsObj.body.findAll(text=re.compile('[A-Za-z0-9\._+-][email protected][A-Za-z0-9\.-]+')) 
    for al in alls: 
     print(al) 
except HTTPError: 
    pass 
except URLError: 
    pass 

ich nur eine E-Mail analysieren erwartet, aber ich diese stattdessen verurteilt tatsächlich analysiert:

If you’ve done all of this and you still have not received your refund yet, please contact us at [email protected] 

Jede Idee, was könnte ich falsch gemacht?

Antwort

4

Dies ist, weil findAll() nach tatsächlichen Elementen oder Textknoten sucht, nicht für separate Wörter.

Was Sie tun müssen, ist zu den gleichen kompilierte regulären Ausdruck auf das Ergebnis gelten:

pattern = re.compile('[A-Za-z0-9\._+-][email protected][A-Za-z0-9\.-]+') 
alls = bsObj.body.find_all(text=pattern) 
for al in alls: 
    print(pattern.search(al).group(0)) 

Auch, weil es eine einzige E-Mail gibt es, festzustellen, ob Sie die find() Methode stattdessen verwenden können.