我正在使用 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']
当要搜索的单词有多个实例时,这两个语句之间有什么区别,使得第二个语句起作用?
以下行正在寻找 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$'))
[]
因此,您的正则表达式正在寻找“Python”的出现,而不是与 NavigableString“Python”完全匹配。
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')
。
除了接受的答案。您可以使用
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']
我没有使用过 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
我并不是建议这是一个替代品,但也许您可以从这个概念中收集一些价值,直到出现直接答案。
这个问题最初是在 2011 年左右提出的,所以现在的解决方案已经相当过时了。 上面的大多数答案不再有效,因为“文本”已被弃用,现在需要“字符串”。
您可能会收到如下警告:
DeprecationWarning:find() 类型方法的“text”参数已被弃用。使用“字符串”代替。
a_python_job = job_card.find(text=re.compile('Python'))
但是,当进行替换时,上述解决方案确实有效。
a_python_job = job_card.find(string=re.compile('Python'))