Подтвердить что ты не робот

Использование BeautifulSoup для поиска html для строки

Я использую BeautifulSoup для поиска введенных пользователем строк на определенной странице. Например, я хочу посмотреть, находится ли строка "Python" на странице: http://python.org

Когда я использовал: find_string = soup.body.findAll(text='Python') find_string возвращен []

Но когда я использовал: find_string = soup.body.findAll(text=re.compile('Python'), limit=1) find_string возвратил [u'Python Jobs'] как ожидалось

В чем разница между этими двумя утверждениями, которые заставляют второй оператор работать, когда есть несколько экземпляров искомого слова

4b9b3361

Ответ 1

Следующая строка ищет точный NavigableString 'Python':

>>> soup.body.findAll(text='Python')
[]

Обратите внимание, что найдена следующая NavigableString:

>>> soup.body.findAll(text='Python Jobs') 
[u'Python Jobs']

Обратите внимание на следующее:

>>> import re
>>> soup.body.findAll(text=re.compile('^Python$'))
[]

Итак, ваше регулярное выражение ищет появление "Python", а не точное соответствие с Pigon NavigableString.

Ответ 2

text='Python' выполняет поиск элементов, которые имеют точный текст, который вы указали:

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

"Чтобы узнать, находится ли строка" Python "на странице http://python.org":

import urllib2
html = urllib2.urlopen('http://python.org').read()
print 'Python' in html # -> True

Если вам нужно найти позицию подстроки внутри строки, вы можете сделать html.find('Python').

Ответ 3

Я не использовал BeuatifulSoup, но, возможно, следующее может помочь некоторым крошечным способом.

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

Я не предлагаю, чтобы это была замена, но, возможно, вы можете получить некоторое значение в концепции до тех пор, пока не появится прямой ответ.