красивая проблема супа с извлечением текста из тега "a", который включает другие теги - PullRequest
1 голос
/ 10 октября 2019

Я хочу извлечь "климат 17.08.2009 14:00" из HTML-тега "a", показанного ниже. Я написал код, который, как мне показалось, извлечет весь текст из тега «а», а затем я извлеку нужную подстроку, используя строковые операции.

<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>

Я запускаю приведенный ниже код и результатбыло:

2:00 PM

Я также изменил строки, как показано ниже, и это не помогло. bar = topics.find('a') до bar = topics.find('a', {"class": "class_a"})

Я проверил тип переменной бара класса bs4.element.Tag (не строка)

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)

Ответы [ 4 ]

3 голосов
/ 10 октября 2019

Если вы уже знаете класс элемента, из которого вы хотите извлечь текст, то вы можете получить значение из его свойств, как любой python dict:

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
1 голос
/ 10 октября 2019

Я думаю, что ваша основная проблема в том, что вы указали «темы» (множественное число) внутри цикла, но хотели «тему» ​​(единственное).

# 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 голос
/ 10 октября 2019

Вы должны получить значение темы атрибута вместо текста привязки, как показано ниже:

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 голос
/ 10 октября 2019

Вы хотите извлечь значение атрибута topic, чтобы получить доступ к нему как к ключу из dict:

print(bar['topic'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...