使用python和beautifulsoup搜索已解析的网页时出错

时间:2012-02-06 10:58:37

标签: python beautifulsoup

我正在登录网站,进行搜索查询,然后使用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">&nbsp;&nbsp;<a href="/message
s.php?action=viewmailbox&amp;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&nbsp;-&nbsp;7</b>, **<b>The.Testing
.example.T3Z6.L</b>**, <b><span style="color:#FF5500;">dgHn</span
></b>, <b><a href="/details.php?id=15829&amp;hit=1&amp;filelist=1">1</a></b>, <b
><a href="/details.php?id=15829&amp;hit=1&amp;=1"><font>30</font></a></
b>, <b><a href="/details.php?id=15829&amp;hit=1&amp;todlers=1">1</a></b>,

当我打印过滤后,我得到上述结果。它稍长但你明白了。从**底部开始的五行您会看到结果应该是正面但不是。

3 个答案:

答案 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细节。

filteredb个元素的列表。你错过了一个级别。试试这个:

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)