web-dev-qa-db-ja.com

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']_を返しました

検索するWordのインスタンスが複数ある場合に2番目のステートメントを機能させるこれら2つのステートメントの違いは何ですか

40
kachilous

次の行はexact 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$'))
[]

したがって、正規表現は、NavigableString「Python」と完全に一致するものではなく、「Python」の出現を探しています。

46
sgallen

_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')を実行できます。

22
jfs

私は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

私はこれが代替品であることを提案していませんが、多分あなたは直接的な答えが出てくるまでコンセプトの価値を集めることができます。

1
Bit Bucket