2013-07-02 3 views
0

Если мои теги держать на изменение следующим образом:Синтаксический изменение метки BeautifulSoup

<tr id="CN13FUT"> 
<tr id="CU13FUT"> 
<tr id="CZ13FUT"> 
<tr id="CH14FUT"> 
[...] 

Как я могу читать это с помощью BeautifulSoup? Это то, что мне нужна помощь с:

table = BeautifulSoup(page) 
for tr in table.findAll('tr', attrs = {'id': 'something_here')) 
    print tr 

Я не хочу использовать только table.findAll('tr') потому что там может быть и другие tr теги, которые я не хочу, я хочу только о том, как это показано в формате выше.

+0

У всех 'tr' (те, которые вам нужны) есть идентификатор? И всегда ли они начинаются с C? – TerryA

ответ

0

Вы можете использовать регулярное выражение, чтобы определить, какие <tr> s вы хотите:

import bs4 as bs 
import re 

doc = '''<tr id="CN13FUT"> 
    <tr id="CU13FUT"> 
    <tr id="CZ13FUT"> 
    <tr id="CH14FUT"> 
    <tr id="ButNotThis"> 
    ''' 
table = bs.BeautifulSoup(doc) 
for tr in table.findAll(id=re.compile(r'CN13|CU13|CZ13|CH14')): 
    print(tr) 

дает

<tr id="CN13FUT"> 
</tr> 
<tr id="CU13FUT"> 
</tr> 
<tr id="CZ13FUT"> 
</tr> 
<tr id="CH14FUT"> 
</tr> 
+0

Но что, если я не знал, сколько тэгов ' id = ...' были? Возможно, было бы легче прочитать все теги 'tr' и проанализировать правильные. –

+0

Мое решение не требует, чтобы вы знали * число * тегов. Он предназначен только для отображения * формы * ответа, основанного на использовании шаблона регулярного выражения для выбора требуемых тэгов. Вы никогда не заявляли критерий выбора нужных тэгов tr, поэтому я предполагаю, что вы знаете, как сформировать правильный шаблон регулярного выражения. Если вам нет, вам нужно указать критерий. – unutbu

0

Если все атрибуты ID заканчиваются в "FUT", то

for tr in table.findAll(id=re.compile('FUT$')): 
    print(tr) 
    print(tr['id']) # to print the id attributes 

Если все атрибуты id имеют одинаковую длину (7), то

for tr in table.findAll('tr', id=lambda x: x and len(x)==7): 
    print(tr['id']) # to print the id attributes