web-dev-qa-db-fra.com

Utilisation de BeautifulSoup pour rechercher du html pour une chaîne

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

40
kachilous

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.

46
sgallen

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'))

Sortie

[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').

22
jfs

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.

1
Bit Bucket