使用 BeautifulSoup 搜索 HTML 中的字符串

问题描述 投票:0回答:5

我正在使用 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']

当要搜索的单词有多个实例时,这两个语句之间有什么区别,使得第二个语句起作用?

python beautifulsoup
5个回答
89
投票

以下行正在寻找 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”完全匹配。


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


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

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

我并不是建议这是一个替代品,但也许您可以从这个概念中收集一些价值,直到出现直接答案。


0
投票

这个问题最初是在 2011 年左右提出的,所以现在的解决方案已经相当过时了。 上面的大多数答案不再有效,因为“文本”已被弃用,现在需要“字符串”。

您可能会收到如下警告:

DeprecationWarning:find() 类型方法的“text”参数已被弃用。使用“字符串”代替。

a_python_job = job_card.find(text=re.compile('Python'))

但是,当进行替换时,上述解决方案确实有效。

a_python_job = job_card.find(string=re.compile('Python'))
© www.soinside.com 2019 - 2024. All rights reserved.