BeautifulSoup: просто попасть внутрь тега, независимо от того, сколько в нем тегов - PullRequest
38 голосов
/ 02 июня 2010

Я пытаюсь очистить весь внутренний html-файл от элементов <p> на веб-странице с помощью BeautifulSoup. Есть внутренние теги, но мне все равно, я просто хочу получить внутренний текст.

Например, для:

<p>Red</p>
<p><i>Blue</i></p>
<p>Yellow</p>
<p>Light <b>green</b></p>

Как мне извлечь:

Red
Blue
Yellow
Light green

Ни .string, ни .contents[0] не делают то, что мне нужно. .extract() также не требуется, потому что я не хочу заранее указывать внутренние теги - я хочу разобраться с любыми возможными.

Есть ли в BeautifulSoup метод типа "просто получить видимый HTML"?

---- UPDATE ------

По совету, пытаясь:

soup = BeautifulSoup(open("test.html"))
p_tags = soup.findAll('p',text=True)
for i, p_tag in enumerate(p_tags): 
    print str(i) + p_tag

Но это не помогает - оно печатает:

0Red
1

2Blue
3

4Yellow
5

6Light 
7green
8

Ответы [ 4 ]

67 голосов
/ 02 июня 2010

Краткий ответ: soup.findAll(text=True)

На этот вопрос уже дан ответ, здесь, в StackOverflow и в документации BeautifulSoup .

UPDATE:

Чтобы уточнить, рабочий кусок кода:

>>> txt = """\
<p>Red</p>
<p><i>Blue</i></p>
<p>Yellow</p>
<p>Light <b>green</b></p>
"""
>>> import BeautifulSoup
>>> BeautifulSoup.__version__
'3.0.7a'
>>> soup = BeautifulSoup.BeautifulSoup(txt)
>>> for node in soup.findAll('p'):
    print ''.join(node.findAll(text=True))

Red
Blue
Yellow
Light green
11 голосов
/ 14 декабря 2016

Принятый ответ великолепен, но ему уже 6 лет, так что вот текущая Beautiful Soup 4 версия этого ответа:

>>> txt = """\
<p>Red</p>
<p><i>Blue</i></p>
<p>Yellow</p>
<p>Light <b>green</b></p>
"""
>>> from bs4 import BeautifulSoup, __version__
>>> __version__
'4.5.1'
>>> soup = BeautifulSoup(txt, "html.parser")
>>> print("".join(soup.strings))

Red
Blue
Yellow
Light green
3 голосов
/ 10 июля 2018

Обычно данные, извлеченные с веб-сайта, содержат теги. Чтобы избежать этих тегов и отображать только текстовое содержимое, вы можете использовать атрибут text.

Например,

    from BeautifulSoup import BeautifulSoup

    import urllib2 
    url = urllib2.urlopen("https://www.python.org")

    content = url.read()

    soup = BeautifulSoup(content)

    title = soup.findAll("title")

    paragraphs = soup.findAll("p")

    print paragraphs[1] //Second paragraph with tags

    print paragraphs[1].text //Second paragraph without tags

В этом примере я собираю все абзацы с сайта Python и отображаю его с тегами и без тегов.

0 голосов
/ 23 декабря 2017

Сначала преобразуйте html в строку, используя str. Затем используйте следующий код с вашей программой:

import re
x = str(soup.find_all('p'))
content = str(re.sub("<.*?>", "", x))

Это называется regex. Этот удалит все, что находится между двумя тегами html (включая теги).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...