使用BeautifulSoup在HTML中查找字符串
我正在使用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'。