J'utilise BeautifulSoup pour rechercher des chaînes entrées par l'utilisateur sur une page spécifique. Par exemple, je veux voir si la chaîne 'Python' se trouve sur la page: http://python.org
Lorsque j'ai utilisé: find_string = soup.body.findAll(text='Python')
find_string a renvoyé []
Mais quand j'ai utilisé: find_string = soup.body.findAll(text=re.compile('Python'), limit=1)
find_string a retourné [u'Python Jobs']
Comme prévu
Quelle est la différence entre ces deux instructions qui fait fonctionner la deuxième instruction lorsqu'il y a plusieurs instances de Word à rechercher
La ligne suivante recherche le exact NavigableString 'Python':
>>> soup.body.findAll(text='Python')
[]
Notez que la NavigableString suivante est trouvée:
>>> soup.body.findAll(text='Python Jobs')
[u'Python Jobs']
Notez ce comportement:
>>> import re
>>> soup.body.findAll(text=re.compile('^Python$'))
[]
Votre expression rationnelle recherche donc une occurrence de "Python" et non la correspondance exacte avec "NavigableString" Python.
text='Python'
Recherche les éléments dont le texte est exact:
import re
from BeautifulSoup import BeautifulSoup
html = """<p>exact text</p>
<p>almost exact text</p>"""
soup = BeautifulSoup(html)
print soup(text='exact text')
print soup(text=re.compile('exact text'))
[u'exact text']
[u'exact text', u'almost exact text']
"Pour voir si la chaîne 'Python' se trouve sur la page http://python.org ":
import urllib2
html = urllib2.urlopen('http://python.org').read()
print 'Python' in html # -> True
Si vous avez besoin de trouver une position de sous-chaîne dans une chaîne, vous pouvez faire html.find('Python')
.
Je n'ai pas utilisé BeuatifulSoup mais peut-être que ce qui suit peut aider d'une manière infime.
import re
import urllib2
stuff = urllib2.urlopen(your_url_goes_here).read() # stuff will contain the *entire* page
# Replace the string Python with your desired regex
results = re.findall('(Python)',stuff)
for i in results:
print i
Je ne dis pas qu'il s'agit d'un remplacement, mais vous pouvez peut-être glaner une certaine valeur dans le concept jusqu'à ce qu'une réponse directe arrive.