Как я могу получить несколько классов в span с Beautifulsoup? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь получить классы span в <p> с Beautifulsoup.

HTML примерно так

...
<p class="card-list">
<span class="span1 class1"></span>
<span class="span2 class2"></span>
<span class="span3 class3"></span>
<span class="span4 class4"></span>
</p>

Я использую код

soup = BeautifulSoup(page.read(), "html.parser")
services = soup.find_all('li', {'class': 'card-list'})

for eachclass in services:
    classes = []
    for spans in eachclass.find('p', {'class':'card-info'}):
        for element in spans.find_all(class_=True):
            classes.extend(element["class"])
        print(classes)

Вывод, который я получаю:

classes = ["span1", "class1", "span2", "class2","span3", class3","span4", "class4"]

Что я хочу, это

classes = ["span1 class1", "span2 class2","span3 class3","span4 class4"]

Есть и другие <span>. Мне просто нужны классы <span> в теге <p class="card-list">.

Ответы [ 4 ]

1 голос
/ 26 марта 2020

Попробуйте это следующим образом:

cards = """
<p class="card-list">
<span class="span1 class1"></span>
<span class="span2 class2"></span>
<span class="span3 class3"></span>
<span class="span4 class4"></span>
</p>
"""
from bs4 import BeautifulSoup as bs
soup = bs(cards,'lxml')
classes = []
for c in soup.select('span'):
    elem = ' '.join(map(str, c['class'])) 
    classes.append(elem)
print(classes)

Вывод:

['span1 class1', 'span2 class2', 'span3 class3', 'span4 class4']

0 голосов
/ 27 марта 2020

Решения с использованием библиотеки SimplifiedDo c.

from simplified_scrapy import SimplifiedDoc,req,utils
html='''
<li class="card-list">
<p class="card-info">
<span class="span1 class1"></span>
<span class="span2 class2"></span>
<span class="span3 class3"></span>
<span class="span4 class4"></span>
</p>
</li>'''
doc = SimplifiedDoc(html)
classes = doc.selects('li.card-list').select('p.card-info').selects('span>class()')
print (classes)

Результат:

[['span1 class1', 'span2 class2', 'span3 class3', 'span4 class4']]
0 голосов
/ 26 марта 2020

Я решил это, создав один список и добавив оба class каждого span, а затем присоединив их к ' '.join(listname) Позже я добавил этот список в другой список.

0 голосов
/ 26 марта 2020

Попробуйте следующий код.

from bs4 import BeautifulSoup
html = """
<p class="card-list">
<span class="span1 class1"></span>
<span class="span2 class2"></span>
<span class="span3 class3"></span>
<span class="span4 class4"></span>
</p>
"""

soup = BeautifulSoup(html,'html.parser')
allclasses = []
for item in soup.find('p',class_='card-list').find_all('span'):
    classes=' '.join(item.attrs['class'])
    allclasses.append(classes)
print(allclasses)

Выход :

['span1 class1', 'span2 class2', 'span3 class3', 'span4 class4']

Обновлено

allclasses = []
for item in soup.select("p[class='contact-info '] span[class]"):
    classes=' '.join(item.attrs['class'])
    allclasses.append(classes)
print(allclasses)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...