Почему он никогда не выводит 'b'?
Вы предполагаете, что теги, возвращаемые функцией findAll, являются диктатами, хотя на самом деле это не так.Используемая вами библиотека BeautifulSoup имеет свои собственные классы, в данном случае BeautifulSoup.Tag, которые могут работать очень похоже на диктовку, но это не так.
Здесь, проверьте это:
>>> doc = ['<html><head><title>Page title</title></head>',
... '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
... '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
... '</html>']
>>> soup = BeautifulSoup(''.join(doc))
>>> tag = soup.findAll("p")[0]
>>> type(tag)
class 'BeautifulSoup.Tag'>
>>> isinstance(tag, dict)
False
Так как это на самом деле не диктат, вы получаете другое (специфичное для домена) поведение, в данном случае список непосредственных потомков (теги, непосредственно содержащиеся в теге, который вы «индексируете»).
Похоже, вы хотите узнать, имеет ли тег input атрибут type , поэтомуВ документации BeautifulSoup вы можете перечислить атрибуты тега, используя tag.attrs и attrMap.
>>> tag.attrs
[(u'id', u'firstpara'), (u'align', u'center')]
>>> tag.attrMap
{u'align': u'center', u'id': u'firstpara'}
>>> 'id' in tag.attrMap
True
BeautifulSoup - действительно полезная библиотека, но с ней нужно поиграться, чтобы получить результатыты хочешь.Обязательно проводите время в интерактивной консоли, играя с классами, и не забывайте использовать синтаксис справки (someobject), чтобы увидеть, с чем вы играете и какими методами он обладает.