google_online
@google_online
My morning begins with coffee and Twitter.

Как получить текст из всех тeгов 'p'?

BeautifulSoup. У меня не получается получить текст из всех тегов 'p'.
soup = BeautifulSoup('<html><div><p>hello world 1</p></div><div><p>hello world 2</p></div> 
    </html>', features='lxml')
    tags = soup.find('div')
    for x in tags.find_all('p'):
        print(x.get_text())

Возвращает только первый hello world 1. Как получить все хеллоу ворлды?
Я конечно могу сделать так и получить все хеллоу ворлды,

for x in soup.find_all('p'): print(x.get_text())
но это не подходит для реального скрипта ....
  • Вопрос задан
  • 5551 просмотр
Решения вопроса 1
@MrDwayne
Вся ваша проблема состоит в том, что Вы хотите получить текст со всех тегов 'p', но при этом вы извлекаете лишь один тег 'div'
Если Вы хотите получить текст из всех тегов 'p', то Вам надо для начала прочитать все теги 'div'.
tags = soup.find('div')
Стоит заменить на
tags = soup.find_all('div')
Благодаря этому мы получаем массив, в котором лежат все наши теги 'div'
Посмотрим на наш текущий массив, который хранит переменная tags:
[<div><p>hello world 1</p></div>, <div><p>hello world 2</p></div>]

После чего его следует перебрать
for x in tags:
Перебирая элементы массива с тегами 'div', нам надо получать новый массив, который будет содержать элементы с тегами 'p', которые расположены в определенном теге 'div'
for x in tags:
    texts = x.find_all('p')

Теперь у нас есть массив тегов 'p' в определенном 'div' ( находится в переменной texts ), который генерируется с разными элементами для определенного тега 'div' при переборе массива tags, осталось лишь перебрать этот массив и получить текст с каждого тега 'p'
for text in texts:
    print(text.get_text())

Полный код ( переименовал переменные для большей читаемости )
soup = BeautifulSoup('<html><div><p>hello world 1</p></div><div><p>hello world 2</p></div></html>', features='lxml')
divs = soup.find_all('div')
for div in divs:
    ps = div.find_all('p')
    for p in ps:
        print(p.get_text())
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lega
>>> html = '<html><div><p>hello world 1</p></div><div><p>hello world 2</p></div> </html>'
>>> re.findall(r'<p>([^<]+)</p>', html)
['hello world 1', 'hello world 2']
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы