Использование 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']
как ожидалось
В чем разница между этими двумя утверждениями, которые заставляют второй оператор работать, когда есть несколько экземпляров искомого слова
Ответы
Ответ 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
Я не предлагаю, чтобы это была замена, но, возможно, вы можете получить некоторое значение в концепции до тех пор, пока не появится прямой ответ.