Использование BeautifulSoup для поиска html-строки - PullRequest
40 голосов
/ 20 января 2012

Я использую 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'] как и ожидалось

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

Ответы [ 3 ]

46 голосов
/ 20 января 2012

Следующая строка ищет точный 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', а не точное совпадение с 'Python' NavigableString.

22 голосов
/ 20 января 2012

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

1 голос
/ 20 января 2012

Я не использовал 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...