Индекс Dict в BeautifulSoup и «если x в Dict» - PullRequest
0 голосов
/ 29 августа 2011

Не думаю, что понимаю, как проверить, существует ли индекс массива ...

for tag in soup.findAll("input"):
            print tag['type']
            if 'type' in tag:
                print "b"

Выводы:

2255
text
hidden
text
text
text
Traceback (most recent call last):
  File "/home//workspace//src/x.py", line 268, in <module>
    print tag['type']
  File "/home//workspace//src/BeautifulSoup.py", line 601, in __getitem__
    return self._getAttrMap()[key]
KeyError: 'type'

Почему он не выводит 'b'?

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

BeautifulSoup Tag - это не dict.Иногда он действует как один определенным образом (нотация [], как вы обнаружили, получает значение атрибута), но другими способами это не так.in на Tag проверит, является ли тег прямым потомком этого тега;он не проверяет атрибуты.

Вместо этого вы можете сделать что-то вроде этого:

if not tag.get('type', None):
    pass # type is empty or nonexistent
1 голос
/ 29 августа 2011

Почему он никогда не выводит '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), чтобы увидеть, с чем вы играете и какими методами он обладает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...