При использовании BeautifulSoup4 я могу запустить этот код, чтобы получить один «крик» без проблем. Когда я использую цикл for
, я получаю ошибку AttributeError: 'NavigableString' object has no attribute 'children'
BeautifulSoup: AttributeError: объект 'NavigableString' не имеет атрибута 'children'
class Shout:
def __init__(self, user, msg, date):
self.user = user
self.msg = msg
self.date = date
def getShouts():
#s is a requests Session()
new_shouts = s.get(shouts_url).text
#set shouts page as parsable object
soup = BeautifulSoup(new_shouts)
shouts = []
shout_heads = soup.find_all("h2", {'class': 'A'})
shout_feet = soup.find_all("h2", {'class': 'B'})
for i in range(len(shout_heads)):
shout = Shout('', '', '')
shout.user = list(list(list(shout_heads[i].children)[0].children)[1].children)[1].get_text()
foot = shout_feet[i].get_text().split('-')
shout.msg = foot[1]
foot[2] = foot[2].split()
shout.date = foot[2][0] + " " + foot[2][1]
shouts.append(shout)
return shouts
Что бы причиной этой ошибки происходит только во время цикла?
Прежде всего, спасибо за тонну за то, что помогли мне избавиться от всех этих вызовов 'list()'. Я посмотрю, что я могу сделать, чтобы отфильтровать текстовые узлы, но я был убежден, что каждый «Shout» будет отформатирован одинаково (без дополнительных узлов). – kaloncpu57
Теперь я вижу, что мне нужно будет еще немного фильтровать, потому что 'shout_feet [i] .get_text()' возвращается больше, чем хотелось бы. Что касается циклов над 'range()', я хотел создать 'Shout()' в одном цикле. A 'Shout()' берет как от 'shout_heads', так и от' shout_feet', и я не хотел напрямую перебирать один список. – kaloncpu57
@ kaloncpu57: извините, я пропустил это. Вы можете использовать 'zip()' в этом случае. –