BeautifulSoup: использование строк для получения значения - PullRequest
2 голосов
/ 12 мая 2011

Можно ли использовать строку для получения значения тега?

Структура XML:

book
   title
      titletext
book
   title
      titletext

Код:

books = BeautifulStoneSoup().findAll('book')
for book in books:
    book.title.titletext.string
    #book.get_by_string('title.titletext').string is this possible?

Если это невозможно, поддерживает ли getattr несколько уровней?

getattr(book, 'title.titletext').string

Я провел некоторое тестирование, и это не представляется возможным, но, может быть, есть альтернатива?

Если я не думаю, что мне нужно написать собственную рекурсивную функцию, чтобы найти атрибут?

1 Ответ

2 голосов
/ 12 мая 2011

Я бы предложил заглянуть в ElementTree. Это то, что вам нужно. В качестве быстрого примера:

import xml.etree.cElementTree

doc = xml.etree.cElementTree.parse( filename )
for e in doc.getiterator( 'title' ):
    book_title = e.attrib[ 'titletext' ]

Очевидно, что я не обрабатываю условия ошибки, но достаточно использовать try / исключением или проверку, чтобы определить, присутствует ли в заголовке 'titletext'.

Если вы ищете определенный тег, а не атрибут тега, приведенный выше код все равно будет работать:

import xml.etree.cElementTree

doc = xml.etree.cElementTree.parse( filename )
for e in doc.getiterator( 'titletext' ):
    book_title = e.text

В общем, с ElementTree работать легче, чем с BeautifulSoup, по крайней мере, для тех вещей, с которыми я работаю. Я обнаружил, что он немного быстрее для наших дел и легче обрабатывает дела, подобные вашему (на мой взгляд).

НТН.

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