#python #python-3.x #web-scraping #beautifulsoup #web-crawler
#python #python-3.x #очистка веб-страниц #beautifulsoup #веб-сканер
Вопрос:
Я хочу получить полное текстовое содержимое каждого тега. Например, если у нас есть что-то вроде этого:
html_code = """
<body>
<h1>hello<b>there</b>how are you?</h1>
</body>"""
Я хочу получить этот результат:
-
Для
body
тега:''
(ничего — без каких-либо дочерних элементов) -
Для
h1
тега:'hello there how are you?'
(со всеми дочерними элементами) -
Для
b
тега:'there'
(со всеми дочерними элементами)
Я пробовал много вещей, но ни одна из них не дает мне такого результата. Есть предложения?
Комментарии:
1. Этот вопрос уже задавался сегодня, а также задавался много раз раньше. Вы пробовали искать существующие ответы?
2. чувак, ты можешь дать мне ссылку? я думаю, что ни один из них не возвращает результат, подобный этому
3. @behzadmehrabi чувак, QHarr прав. В SO есть МНОЖЕСТВО примеров для этого, а также простой поиск в Google. Что вы пробовали?
4. @chitown88 можешь дать ссылку, чувак?
5. Прохладный. Что именно вы пробовали с beautifulsoup? Укажите это в своем вопросе. Покажите, какой вывод или ошибку это дало вам. И то, что вы ожидаете (которое вы включили). Это дает пользователям возможность поработать над чем-то и показывает, что вы сначала попробовали это самостоятельно.
Ответ №1:
Вам придется работать с .find()
или .find_all()
затем, хотите ли вы включить дочерние теги или нет, используйте recursive
параметр:
html_code = """
<body>
<h1>hello<b>there</b>how are you?</h1>
</body>"""
import bs4
soup = bs4.BeautifulSoup(html_code, 'html.parser')
body_text = soup.body.find_all(text=True, recursive=False)
h1_text = soup.h1.find_all(text=True, recursive=True)
b_text = soup.b.find_all(text=True, recursive=False)
body_text = ' '.join(body_text).strip()
h1_text = ' '.join(h1_text).strip()
b_text = ' '.join(b_text).strip()
print ('body: %snh1: %snb: %s' %(body_text, h1_text, b_text))
Вывод:
body:
h1: hello there how are you?
b: there