Я хочу напечатать данные из div со значением класса, но мой код продолжает возвращать дополнительные данные из другого подобного div - PullRequest
2 голосов
/ 20 октября 2019

Вот HTML-код:

<div class="sizeBlock">
 <div class="size"> 
    <a class="selectSize" id="44526" data-size-original="36.5">36.5</a> 
 </div> 
 <div class="size inactive active"> 
    <a class="selectSize" id="44524" data-size-original="40">40</a> 
 </div> 
 <div class="size"> 
    <a class="selectSize" id="44525" data-size-original="40.5">40.5</a> 
 </div> 
</div>

Я хочу получить значения тега id и оригинального размера данных только внутри <div class="size">.

Вот мой код:

for sizeBlock in soup.select('div.size a.selectSize'):
aid = sizeBlock.get('id')
size = sizeBlock.get('data-size-original')
print(aid, size)

Проблема в том, что он также возвращает данные из <div class="size inactive active">

Вот изображение выполнения кода

Ответы [ 3 ]

1 голос
/ 20 октября 2019
from bs4 import BeautifulSoup


html_doc = """<div class="sizeBlock">
 <div class="size"> 
    <a class="selectSize" id="44526" data-size-original="36.5">36.5</a> 
 </div> 
 <div class="size inactive active"> 
    <a class="selectSize" id="44524" data-size-original="40">40</a> 
 </div> 
 <div class="size"> 
    <a class="selectSize" id="44525" data-size-original="40.5">40.5</a> 
 </div> 
</div>"""  


soup = BeautifulSoup(html_doc)
for sizeBlock in soup.select('div.size'):
    if sizeBlock.get('class') != ['size']:
        continue
    soup2 = sizeBlock.select('a.selectSize')[0]
    aid = soup2.get('id')
    size = soup2.get('data-size-original')
    print(aid, size)

Вывод:

44526 36.5
44525 40.5

Объяснение:

if sizeBlock.get('class') != ['size']:
    continue

Пропустит любой класс, который не является 'size' != не равен оператору. Так как для класса «размер неактивный активный» get('class') возвращает ['size', 'inactive', 'active'], этот блок передается в цикле.

sizeBlock.select('a.selectSize')

возвращает список

[<a class="selectSize" data-size-original="36.5" id="44526">36.5</a>]

и т. Д.

sizeBlock.select('a.selectSize')[0]

возвращает первый (и единственный) элемент этого списка.

1 голос
/ 20 октября 2019

Я думаю, вы могли бы пойти с более лаконичным методом, используя селектор атрибута класса (используя селектор атрибута, вы можете ограничить родительский div одним подходящим классом) и создать словарь:

from bs4 import BeautifulSoup as bs
import requests

html = '''<div class="sizeBlock">
 <div class="size"> 
    <a class="selectSize" id="44526" data-size-original="36.5">36.5</a> 
 </div> 
 <div class="size inactive active"> 
    <a class="selectSize" id="44524" data-size-original="40">40</a> 
 </div> 
 <div class="size"> 
    <a class="selectSize" id="44525" data-size-original="40.5">40.5</a> 
 </div> 
</div>'''

soup = bs(html, 'lxml')
d = {i['id']:i['data-size-original'] for i in soup.select('[class=size] a')}
print(d)

Отрегулируйте понимание слова в цикле, если хотите хранить в переменных

for i in soup.select('[class=size] a'):
    aid = i['id'];size = i['data-size-original'] 
    print(aid, size)
0 голосов
/ 20 октября 2019

Вы можете реализовать функциональность, как показано ниже.

soup = BeautifulSoup(html_doc, 'html.parser')
all_a = soup.find_all('a')
for a in all_a:
    aid = a.get('id')
    size = a.get('data-size-original')
    print(aid, size)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...