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

1

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

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

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

Поэтому, используя приведенный ниже пример, скажем, что мой последний том равен 13, а последний номер - 1, мне нужно будет вернуть href для vol 13, 2 и vol 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))

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

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

Может кто-нибудь, пожалуйста, помогите мне? Благодарю.

Теги:
beautifulsoup

2 ответа

1
Лучший ответ

Я думаю, что вы ищете 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
    Да, с этим я могу работать! Большое спасибо. Я приветствую другие решения только для получения дополнительных знаний, но это то, что я хотел получить. На самом деле мне может потребоваться изменить это немного, потому что иногда объем и выпуск могут содержать символ, например, 1 для дополнения к выпуску 1 ...
0
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 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню