我正在登录网站,进行搜索查询,然后使用beautifulsoup过滤结果以获取“b”标记中的所有条款。从结果我想检查搜索词(测试)是否存在。我目前的代码如下。我遇到的问题是,即使有结果并且该术语存在,我仍然得到一个不存在的回应。我已打印过滤后的查询并通读它,结果肯定存在,所以错误在搜索部分。我认为问题在于,在html中,单词测试本身并不是它的Testing.example或Testing.test,因此搜索无法通过它自己被空格包围来找到它。如何在较长的单词/短语中搜索单词/短语。
我需要在“example.Testing.example”或“test.Testing.example”中找到“测试”
希望这是有道理的。
由于
words = ["Testing"]
br.open ('http://www.example.com/browse.php?psec=2&search=%s' % words)
html = br.response().read()
soup = BeautifulSoup(html)
filtered = soup.findAll('b')
# print filtered
for word in words:
if word in filtered:
print "%s found." % word
else:
print "%s not found." % word
修改
[<b><a title="Unknown">---</a></b>, <b>Welcome Back<br /><a href="/user/"><
span style="color:#0080FF;"></span></a>!<br /></b>, <b><span class="smallfo
nt"><a href="/messages.php?action=viewmailbox"><img height="14px" style="border:
none" alt="inbox" title="inbox (no new messages)" src="/pic/pn_inbox.gif" /></a>
59 (0 New)</span></b>, <b><span class="smallfont"> <a href="/message
s.php?action=viewmailbox&box=-1"><img height="14px" style="border:none" alt=
"sentbox" title="sentbox" src="/pic/pn_sentbox.gif" /></a> 37</span></b>, <b>Sho
w all</b>, <b><< Prev</b>, <b>Next >></b>, <b>1 - 7</b>, **<b>The.Testing
.example.T3Z6.L</b>**, <b><span style="color:#FF5500;">dgHn</span
></b>, <b><a href="/details.php?id=15829&hit=1&filelist=1">1</a></b>, <b
><a href="/details.php?id=15829&hit=1&=1"><font>30</font></a></
b>, <b><a href="/details.php?id=15829&hit=1&todlers=1">1</a></b>,
当我打印过滤后,我得到上述结果。它稍长但你明白了。从**底部开始的五行您会看到结果应该是正面但不是。
答案 0 :(得分:1)
我相信你想要更像以下的东西
words = ["Testing"]
br.open ('http://www.example.com/browse.php?psec=2&search=%s' % words)
html = br.response().read()
soup = BeautifulSoup(html)
filtered = soup.findAll('b')
"""element.contents[0] gives you the first element inside the <b> tags
If you want some other part of inside the b tag see
BeatifulSoup documentation at the line below """
filteredcontents = [element.contents[0] for element in filtered]
for word in words:
if any(word in filteredcontent for filteredcontent in filteredcontents):
print "%s found." % word
else:
print "%s not found." % word
BeautifulSoup文档可用 here
答案 1 :(得分:0)
警告lector:我没有进入BeautifulSoup细节。
filtered
是b
个元素的列表。你错过了一个级别。试试这个:
for word in words:
for b_elt in filtered:
if word in b_elt: # or word in b_elt.text or suchlike
print "%s found." % word
答案 2 :(得分:0)
filtered = soup.findAll('b')
会为您提供[one, two]
的结果。
您需要将过滤的内容与单词进行比较
您可以尝试以下内容:
soup.findAll(text=words)