2013-08-01 1 views
0

Я получаю текстовую статью с одного сайта с помощью python и BeatifulSoup. Теперь у меня странная проблема ... Я просто wana распечатываю текст внутри нескольких тегов p, которые находятся в div с классом dr_article. Теперь с кодом вида:Python and Beautiful soup, pick up Все элементы

from bs4 import BeautifulSoup 

def getArticleText(webtext): 
soup = BeautifulSoup(webtext) 
divTag = soup.find_all("div", {"class":"dr_article"}) 
for tag in divTag: 
    pData = tag.find_all("p").text 
    print pData 

я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<pyshell#14>", line 1, in <module> 
execfile("word_rank/main.py") 
    File "word_rank/main.py", line 7, in <module> 
articletext.getArticleText(webtext) 
    File "word_rank\articletext.py", line 7, in getArticleText 
pData = tag.find_all("p").text 
AttributeError: 'list' object has no attribute 'text' 

Но когда я выбираю только первый элемент с [0] перед тем .text я не получаю сообщение об ошибке и работает как предполагается. Он получает текст первого элемента. Чтобы быть точным, я могу изменить мой код, и это выглядит следующим образом:

from bs4 import BeautifulSoup 

def getArticleText(webtext): 
soup = BeautifulSoup(webtext) 
divTag = soup.find_all("div", {"class":"dr_article"}) 
for tag in divTag: 
    pData = tag.find_all("p")[0].text 
    print pData 

Мой вопрос, как я могу получить текст из всех элементов сразу? Что изменить, чтобы я не получал текст только от одного элемента, а от всего?

+0

ли вы попробовать * зацикливание * за счет '.find_all ('р')'? –

ответ

1

Вы получаете все элементы, поэтому функция возвращает список. Попробуйте пройти через это:

from bs4 import BeautifulSoup 

def getArticleText(webtext): 
soup = BeautifulSoup(webtext) 
divTag = soup.find_all("div", {"class":"dr_article"}) 
for tag in divTag: 
    for element in tag.find_all("p"): 
     pData = element.text 
     print pData 

Или вы можете выбрать каждый элемент по отдельности:

tag.find_all("p")[0].text 
tag.find_all("p")[1].text 
tag.find_all("p")[..].text 
tag.find_all("p")[N - 1].text 
tag.find_all("p")[N].text 
+0

Мне удалось получить работу с тегом loop в теге pData, а затем добавить тег .text. Но ваш пример короче, и я буду использовать его ... Спасибо :) – dzordz

 Смежные вопросы

  • Нет связанных вопросов^_^