2012-03-27 1 views
0

Это, вероятно, простой вопрос, но я хотел бы, чтобы перебирать тег с идентификатором = dgrdAcquired_hyplnkacquired_0, dgrdAcquired_hyplnkacquired_1 и т.д.Как я могу перебирать тег с различными идентификаторами с BeautifulSoup в Python

Есть ли проще способ сделать это, чем код, который у меня ниже? Проблема в том, что количество этих тегов будет отличаться для каждой веб-страницы, которую я вытягиваю. Я не уверен, как получить текст в этих тегах, когда на каждой веб-странице может быть разное количество тегов.

html = """ 
<tr> 
<td colspan="3"><table class="datagrid" cellspacing="0" cellpadding="3" rules="rows" id="dgrdAcquired" width="100%"> 
<tr class="datagridH"> 
<th scope="col"><font face="Arial" color="Blue" size="2"><b>Name (RSSD ID)</b></font></th><th scope="col"><font face="Arial" color="Blue" size="2"><b>Acquisition Date</b></font></th><th scope="col"><font face="Arial" color="Blue" size="2"><b>Description</b></font></th> 
</tr><tr class="datagridI"> 
<td nowrap="nowrap"><font face="Arial" size="2"> 
<a id="dgrdAcquired_hyplnkacquired_0" href="InstitutionProfile.aspx?parID_RSSD=3557617&parDT_END=20110429">FIRST CHOICE COMMUNITY BANK                        (3557617)</a> 
</font></td><td><font face="Arial" size="2"> 
<span id="dgrdAcquired_lbldtAcquired_0">2011-04-30</span> 
</font></td><td><font face="Arial" size="2"> 
<span id="dgrdAcquired_lblAcquiredDescText_0">The acquired institution failed and disposition was arranged of by a regulatory agency. Assets were distributed to the acquiring institution.</span> 
</font></td> 
</tr><tr class="datagridAI"> 
<td nowrap="nowrap"><font face="Arial" size="2"> 
<a id="dgrdAcquired_hyplnkacquired_1" href="InstitutionProfile.aspx?parID_RSSD=104038&parDT_END=20110429">PARK AVENUE BANK, THE                         (104038)</a> 
</font></td> 
""" 
soup = BeautifulSoup(html) 
firm1 = soup.find('a', { "id" : "dgrdAcquired_hyplnkacquired_0"}) 
data1 = ''.join(firm1.findAll(text=True)) 
print data1 

firm2 = soup.find('a', { "id" : "dgrdAcquired_hyplnkacquired_1"}) 
data2 = ''.join(firm2.findAll(text=True)) 
print data2 

ответ

1

Я хотел бы сделать следующее, при условии, что если есть n таких тегов, они пронумерованы 0...n:

soup = BeautifulSoup(html) 
i = 0 
data = [] 
while True: 
    firm1 = soup.find('a', { "id" : "dgrdAcquired_hyplnkacquired_%s" % i}) 
    if not firm1: 
     break 
    data.append(''.join(firm1.findAll(text=True))) 
    print data[-1] 
    i += 1 
+0

Спасибо Аарон. Это прекрасно работает. – myname

+0

+1 для нового подхода! – bernie

1

Regex, вероятно, избыточен в данном конкретном случае.
Тем не менее, вот еще один вариант:

import re 
soup.find_all('a', id=re.compile(r'[dgrdAcquired_hyplnkacquired_]\d+')) 

Пожалуйста, обратите внимание: s/find_all/findAll/g при использовании BS3.
Результат (немного неиспользованных удалено для целей отображения):

[<a href="InstitutionProfile.aspx?parID_RSSD=3557617&amp;parDT_END=20110429" 
    id="dgrdAcquired_hyplnkacquired_0">FIRST CHOICE COMMUNITY BANK (3557617)</a>, 
<a href="InstitutionProfile.aspx?parID_RSSD=104038&amp;parDT_END=20110429" 
    id="dgrdAcquired_hyplnkacquired_1">PARK AVENUE BANK, THE (104038)</a>] 
Смежные вопросы