Quiero extraer el "clima 8/17/2019 2:00 PM" de la etiqueta HTML 'a' que se muestra a continuación. Escribí un código que pensé que extraería todo el texto de la etiqueta 'a' y más tarde, extraeré la subcadena deseada usando operaciones de cadena.

<div class="topic">
    <a class="class_a" href="/href_1" data1="" data2="hello" data3="Hi" date="Monday, August 17" time="2:00 PM" topic="climate 8/17/2019 2:00 PM">
            <span>2:00 PM</span>
        <i class="Afternoon"></i>
    </a>
</div>

Ejecuté el código a continuación y el resultado fue:

2:00 PM

También cambié las líneas como se muestra a continuación y no ayudó. bar = topics.find('a') a bar = topics.find('a', {"class": "class_a"})

Verifiqué que el tipo de la variable de barra es la clase bs4.element.Tag (no una cadena)

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://tbd.com')
bs = BeautifulSoup(html.read(), 'html.parser')

topics = bs.findAll("div", {"class": "topic"})
for topic in topics:
    bar = topic.find('a')
    print (bar.text)
1
Menachem 10 oct. 2019 a las 21:51

4 respuestas

La mejor respuesta

Si ya conoce la clase del elemento del que desea extraer el texto, puede obtener el valor de sus propiedades como cualquier código de Python:

from bs4 import BeautifulSoup

h = """<div class="topic">
    <a class="class_a" href="/href_1" data1="" data2="hello" data3="Hi" date="Monday, August 17" time="2:00 PM" topic="climate 8/17/2019 2:00 PM">
            <span>2:00 PM</span>
        <i class="Afternoon"></i>
    </a>
</div>"""

soup = BeautifulSoup(h, "lxml")
obj = soup.find('a', class_ = "class_a")

print(obj.get('topic'))
#climate 8/17/2019 2:00 PM
3
drec4s 10 oct. 2019 a las 19:01

Creo que su principal problema es que especificó los "temas" (plural) dentro de su ciclo, pero quería "tema" (singular).

# python3 bs_test.py

from urllib.request import urlopen
from bs4 import BeautifulSoup
# html = urlopen('https://tbd.com')
html = """
<div class="topic">
    <a class="class_a" href="/href_1" data1="" data2="hello" data3="Hi" date="Monday, August 17" time="2:00 PM" topic="climate 8/17/2019 2:00 PM">
            <span>2:00 PM</span>
        <i class="Afternoon"></i>
    </a>
</div>
"""


# bs = BeautifulSoup(html.read(), 'html.parser')
bs = BeautifulSoup(html, 'html.parser')

topics = bs.findAll("div", {"class": "topic"})
for topic in topics:
    bar = topic.find('a')
    print (bar['topic'])
1
user212514 10 oct. 2019 a las 19:07

Desea extraer el valor del atributo topic, por lo que debe acceder a él como clave desde un dict:

print(bar['topic'])
1
Alex Lucaci 10 oct. 2019 a las 19:01

Debería obtener el valor del tema de atributo en lugar del texto de anclaje como se muestra a continuación:

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://tbd.com')
bs = BeautifulSoup(html.read(), 'html.parser')

topics = bs.findAll("div", {"class": "topic"})
for topic in topics:
    bar = topic.find('a')
    print (bar.get('topic'))
1
Wasi 11 oct. 2019 a las 14:05
58329361