Python и Beautiful Soup - Поиск по тегу a, возвращайте следующие теги b, пока тег A не будет найден - PullRequest
1 голос
/ 06 сентября 2011

У меня есть 2 переменные, одна с «последним томом», а другая с «последней проблемой».

HTML-код, с которым я имею дело, содержит список всех томов и проблем, в первую очередь самых последних.

Мне нужно вернуть ссылки href для всех томов и проблем, которые новее, чем у меня в файле.

Итак, используя приведенный ниже пример, скажем, мой последний том - 13, а последний выпуск - 1, мне нужно вернуть href для тома 13, 2 и тома 14, 1.

Мне трудно с этим, так как объем сам по себе ...

Вот что у меня есть:

HTML:

<ul class="bobby">
<li><strong>Volume 14</strong></li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, September 2011">Issue 1, September 2011</a>          
</li>
<li><strong>Volume 13</strong></li> 
<li class="">
<a href="/content/ben/cchts/2010/00000013/00000002" title="Issue 2, December 2010">Issue 2, December 2010</a>
</li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, November 2011">Issue 1, November 2011</a>
</li>
</ul>

Сценарий отрублен:

results = soup.find('ul', attrs={'class' : 'bobby'})

#temp until I get it reading from file
lastVol = '13'
#find the last volume
findlastVol = results.findNext('strong', text= re.compile('Volume ' + lastVol))

#temp until I get it reading from file
lastIss = '2'
#find the last issue
findlastIss = findlastVol.findNext('a', text= re.compile('Issue ' + lastIss))

Так что я могу добраться до тега для последнего тома и проблемы в файле, но у меня было несколько неудачных попыток вернуться назад и остановиться в первой проблеме ...

Или начиная с вершины и проходя вниз, пока не будут выполнены условия объема и выпуска ...

Может кто-нибудь помочь мне? Спасибо.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Я думаю, что вы ищете findPrevious , которое вы можете использовать следующим образом:

import BeautifulSoup
import re

content='''
<ul class="bobby">
<li><strong>Volume 14</strong></li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, September 2011">Issue 1, September 2011</a>          
</li>
<li><strong>Volume 13</strong></li> 
<li class="">
<a href="/content/ben/cchts/2010/00000013/00000002" title="Issue 2, December 2010">Issue 2, December 2010</a>
</li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, November 2011">Issue 1, November 2011</a>
</li>
</ul>
'''

last_volume=13
last_issue=1

soup=BeautifulSoup.BeautifulSoup(content)
results = soup.find('ul', attrs={'class' : 'bobby'})
for a_string in results.findAll('a', text=re.compile('Issue')):
    volume=a_string.findPrevious(text=re.compile('Volume'))
    volume=int(re.search(r'(\d+)',volume).group(1))
    issue=int(re.search(r'(\d+)',a_string).group(1))
    href=a_string.parent['href']
    if (volume>last_volume) or (volume>=last_volume and issue>last_issue):    
        print(volume,issue,href)

выходы

(14, 1, u'/content/ben/cchts/2011/00000014/00000001')
(13, 2, u'/content/ben/cchts/2010/00000013/00000002')
0 голосов
/ 07 сентября 2011
from BeautifulSoup import BeautifulSoup
content = '''<ul class="bobby">
<li><strong>Volume 14</strong></li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, September     2011">Issue 1, September 2011</a>          
</li>
<li><strong>Volume 13</strong></li> 
<li class="">
<a href="/content/ben/cchts/2010/00000013/00000002" title="Issue 2, December 2010">Issue 2, December 2010</a>
</li>
<li class="">
<a href="/content/ben/cchts/2011/00000014/00000001" title="Issue 1, November 2011">Issue 1, November 2011</a>
</li>
</ul>
'''
soup = BeautifulSoup(content)
soup.prettify()
last_vol = 13
last_issue = 1

res = soup.find('ul',{"class":"bobby"})
lis = res.findAll('li')
for j in lis:
    if(j.find('strong') != None):
        vol = int(j.contents[0].string[7:])
    elif(vol > last_vol) or (vol == last_vol and int(j.contents[1]['href'][33:]) > last_issue): 
        print "Volume\t:%d" % vol
        print j.contents[1].string
        print "href\t:%s" % j.contents[1]['href']

Придает

Volume  :14  
Issue 1, September 2011  
href    :/content/ben/cchts/2011/00000014/00000001  
Volume  :13  
Issue 2, December 2010  
href    :/content/ben/cchts/2010/00000013/00000002 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...