美丽的汤和搜索结果

时间:2013-04-25 15:55:49

标签: python search beautifulsoup

这是我使用python的第一步,请耐心等待。

基本上我想从一个带有Beautiful Soup的Dokuwiki页面解析一个目录。 TOC看起来像这样:

<div id="dw__toc">
<h3 class="toggle">Table of Contents</h3>
<div>

<ul class="toc">
<li class="level1"><div class="li"><a href="#section">#</a></div>
<ul class="toc">
<li class="level2"><div class="li"><a href="#link1">One</a></div></li>
<li class="level2"><div class="li"><a href="#link2">Two</a></div></li>
<li class="level2"><div class="li"><a href="#link3">Three</a></div></li>

我希望能够搜索a-tags的内容,如果找到结果返回其内容并返回href-link。因此,如果我搜索“one”,结果应为

One
#link1

到目前为止我做了什么:

#!/usr/bin/python2

from BeautifulSoup import BeautifulSoup
import urllib2


#Grab and open URL, create BeatifulSoup object
url = "http://www.somewiki.at/wiki/doku.php"
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
#Grab Table of Contents
grab_toc = soup.find('div', {"id":"dw__toc"})

#Look for all divs with class: li
ftext = grab_toc.findAll('div', {"class":"li"})
#Look for links
links = grab_toc.findAll('a',href=True)

#Iterate
for everytext in ftext:
    text = ''.join(everytext.findAll(text=True))
    data = text.strip()
    print data

for everylink in links:
    print everylink['href']

这会打印出我想要的数据,但我有点丢失重写它以便能够在结果中搜索并且只返回searchterm。试过像

这样的东西
if data == 'searchtearm':
        print data
        break
else:
        print 'Nothing found'

但这是一种弱搜索。有没有更好的方法来做到这一点?在我的示例中,Beatiful Soup结果集已更改为列表。首先在结果集中搜索是否更好,如果是,那么如何做?

1 个答案:

答案 0 :(得分:1)

不是逐个搜索链接,而是使用正则表达式为BeautifulSoup搜索:

import re

matching_link = grab_toc.find('a', text=re.compile('one', re.IGNORECASE))

这会在内容列表中找到第一个 a链接,文本中有3个字符one。然后只需打印链接和文字:

print matching_link.string
print matching_link['href']

基于样本的简短演示:

>>> from bs4 import BeautifulSoup
>>> import re
>>> soup = BeautifulSoup('''\
... <div id="dw__toc">
... <h3 class="toggle">Table of Contents</h3>
... <div>
... 
... <ul class="toc">
... <li class="level1"><div class="li"><a href="#section">#</a></div>
... <ul class="toc">
... <li class="level2"><div class="li"><a href="#link1">One</a></div></li>
... <li class="level2"><div class="li"><a href="#link2">Two</a></div></li>
... <li class="level2"><div class="li"><a href="#link3">Three</a></div></li>
... </ul></ul>''')
>>> matching_link = soup.find('a', text=re.compile('one', re.IGNORECASE))
>>> print matching_link.string
One
>>> print matching_link['href']
#link1

在BeautifulSoup版本3中,上述.find()调用将返回包含的NavigableString对象。要返回父a元素,请使用.parent属性:

matching_link = grab_toc.find('a', text=re.compile('one', re.IGNORECASE)).parent
print matching_link.string
print matching_link['href']