簡體   English   中英

美麗的湯和搜索結果

[英]Beautiful Soup and searching in results

這些是我使用python的第一步,請多多包涵。

基本上,我想用美麗的湯從一個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標簽的內容,如果找到結果,則返回其內容並返回href鏈接。 因此,如果我搜索“一個”,結果應該是

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

這會打印出我想要的數據,但是我有點想重寫它以便能夠在結果中進行搜索,並且只返回搜索項。 嘗試過類似的東西

if data == 'searchtearm':
        print data
        break
else:
        print 'Nothing found'

但這是一個較弱的搜索。 有沒有更好的方法可以做到這一點? 在我的示例中,Beatiful Soup結果集更改為一個列表。 首先搜索結果集中是否更好?如果是,那么該怎么做?

不用一個個地搜索鏈接,而是使用正則表達式讓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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM