Бросок из деструктора может привести к катастрофическому отказу, потому что этот деструктор можно было бы назвать как часть "Раскручивания стека". Раскручивание стека является процедурой, которая происходит, когда исключение выдается. В этой процедуре были брошены все объекты, которые были продвинуты в стек начиная с "попытки" и до исключения, будет завершен->, их деструкторы назовут. И во время этой процедуры, не позволяется другой бросок исключения, потому что не возможно обработать два исключения за один раз, таким образом, это побудит вызов прерываться (), программа откажет, и управление возвратится к ОС.
Из вашего вопроса мне непонятно, почему вам нужно беспокоиться о тегах div
- как насчет того, чтобы делать просто:
soup = BeautifulSoup(html)
thetd = soup.find('td', attrs={'class': 'author'})
print thetd.string
В HTML, который вы даете это в точности излучает:
####I want whatever is located here ###
, что похоже на то, что вы хотите. Возможно, вы можете лучше указать, что именно вам нужно, и этот сверхпростой фрагмент не подходит - несколько тегов td
, все для класса author
, из которых вам необходимо учитывать (все ? только некоторые? какие?), возможно, отсутствует какой-либо такой тег (что вы хотите сделать в этом случае) и тому подобное. Трудно сделать вывод, каковы именно ваши спецификации, только из этого простого примера и избыточного кода; -).
Изменить : если, согласно последнему комментарию OP, существует несколько таких тегов td, по одному на автора:
thetds = soup.findAll('td', attrs={'class': 'author'})
for thetd in thetds:
print thetd.string
... то есть не намного сложнее! -)
BeautifulSoup, безусловно, канонический анализатор / процессор HTML. Но если у вас есть именно такой фрагмент, который вам нужно сопоставить, вместо построения всего иерархического объекта, представляющего HTML, pyparsing упрощает определение начальных и конечных HTML-тегов как части создания более крупного выражения поиска:
from pyparsing import makeHTMLTags, withAttribute, SkipTo
author_td, end_td = makeHTMLTags("td")
# only interested in <td>'s where class="author"
author_td.setParseAction(withAttribute(("class","author")))
search = author_td + SkipTo(end_td)("body") + end_td
for match in search.searchString(html):
print match.body
Pyparsing makeHTMLTags функция делает гораздо больше, чем просто генерирует выражения "
и ""
. Он также обрабатывает:
" "
или вы можете использовать pyquery, поскольку BeautifulSoup больше не поддерживается активно, см. http://www.crummy.com/software/BeautifulSoup/3.1-problems.html
, сначала установите pyquery с помощью
easy_install pyquery
, тогда ваш сценарий может быть таким же простым, как
from pyquery import PyQuery
d = PyQuery('http://mywebpage/')
allauthors = [ td.text() for td in d('td.author') ]
pyquery использует синтаксис селектора css, знакомый по jQuery, который я считаю более интуитивным, чем BeautifulSoup. Он использует lxml внизу и намного быстрее, чем BeautifulSoup. Но BeautifulSoup - это чистый питон, и поэтому он также работает на движке приложений Google