使用BeautifulSoup在HTML中查找字符串

80 投票
4 回答
176237 浏览
提问于 2025-04-17 10:40

我正在使用BeautifulSoup这个工具来查找用户输入的字符串,目标是特定的网页。比如,我想看看网页上有没有'Python'这个词:http://python.org

当我使用以下代码时:

find_string = soup.body.findAll(text='Python')

结果是[],也就是没有找到任何内容。

但是当我改用这段代码:

find_string = soup.body.findAll(text=re.compile('Python'), limit=1)

结果却返回了[u'Python Jobs'],这正是我期待的结果。

这两段代码有什么不同,为什么第二段代码在有多个'Python'的情况下能正常工作呢?

相关问题:

4 个回答

13

除了被接受的答案之外,你还可以用一个叫做lambda的东西来代替regex(正则表达式):

from bs4 import BeautifulSoup

html = """<p>test python</p>"""

soup = BeautifulSoup(html, "html.parser")

print(soup(text="python"))
print(soup(text=lambda t: "python" in t.text))

输出结果:

[]
['test python']
38

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

88

下面这行代码是在寻找完全相同的可导航字符串 'Python':

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

注意,下面这个可导航字符串是被找到的:

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

请注意这个行为:

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

所以你的正则表达式是在寻找 'Python' 的出现,而不是完全匹配可导航字符串 'Python'。

撰写回答