Как получить данные, если существует более одного div с одним и тем же классом на Pyhton - PullRequest
0 голосов
/ 24 апреля 2020

При загрузке страницы я могу найти 1 деление, 2 деления, 3 деления или 0 делений на каждую загрузку

Пример с тремя делениями ниже:

<div class="SOME_dIV">
     <span class="class_title">TITLE-1</span>
     <span class="_some_class1">VALUE-1</span>
     <span class="_some_class2">VALUE-2</span>
     <span class="_some_class3">VALUE-3</span>
</div>

<div class="SOME_dIV">
     <span class="class_title">TITLE-2</span>
     <span class="_some_class1">VALUE-10</span>
     <span class="_some_class2">VALUE-20</span>
     <span class="_some_class3">VALUE-30</span>
</div>

<div class="SOME_dIV">
     <span class="class_title">TITLE-3</span>
     <span class="_some_class1">VALUE-100</span>
     <span class="_some_class2">VALUE-200</span>
     <span class="_some_class3">VALUE-300</span>
</div>


Мой pyhton код

html = webdriver.Firefox()

html.get('DYNAMIC_URL')

html_source = html.page_source

html_source_bs = bs(html_source, 'html.parser')

all_divs = html_source_bs.find_all('div', class_='SOME_DIV')

span_litle = all_divs[0].find('div', class_='class_title')
span_1 = all_divs[0].find_all('span', class_=lambda c: '_some_class1' in c)
span_2 = all_divs[0].find_all('span', class_=lambda c: '_some_class2' in c)
span_3 = all_divs[0].find_all('span', class_=lambda c: '_some_class3' in c)

title_list = ['Title']
span1_list = ['Span1']
span2_list = ['Span2']
span3_list = ['Span3']

for l_title in corrida_numero:
    result = l_title.strip()
    title_list.append(result)

for l_1 in participantes_numeros[0:]:
    result = l_1.text.strip()
    span1_list.append(result)

for l_2 in participantes_nomes[0:]:
    result = l_2.text.strip()
    span2_list.append(result)

for l_3 in participantes_odds[0:]:
    result = l_3.text.strip()
    span3_list.append(result)


print(title_list)
print(span1_list)
print(span2_list)
print(span3_list)

Вывод

['Title', 'TITLE-1']
['Span1', 'VALUE-1']
['Span2', 'VALUE-2']
['Span3', 'VALUE-3']

Ожидаемый вывод, если есть 3 деления

['Title', 'TITLE-1']
['Span1', 'VALUE-1']
['Span2', 'VALUE-2']
['Span3', 'VALUE-3']

['Title', 'TITLE-2']
['Span1', 'VALUE-10']
['Span2', 'VALUE-20']
['Span3', 'VALUE-30']

['Title', 'TITLE-3']
['Span1', 'VALUE-100']
['Span2', 'VALUE-200']
['Span3', 'VALUE-300']

Я собираю информацию в Интернете с одного сайта. Когда сайт загружается, я могу найти один div с классом 'SOME_DIV, 2 div или 3 div, или даже больше, а также с любым div (0).

Если есть 3 div с классом' SOME_DIV ', когда webdriver загружает страницу, затем я хочу получить информацию для всех элементов div.

В данный момент я могу получить только первые данные div с помощью "all_divs [0] .find_all", я хочу получить данные о другие div, если они существуют, но я не знаю, сколько div будет найдено, пока страница не загрузится.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вы можете использовать длину all_divs и использовать a для l oop и соответствующий индекс для очистки и анализа данных.

см. Пример кода ниже,

all_divs = html_source_bs.find_all('div', class_='SOME_DIV')

span_title = []
span_1 =[]
span_2 =[]
span_3 =[]
for i in range(len(all_divs):
    span_title.append(all_divs[i].find('div', class_='class_title'))
    span_1.append(all_divs[0].find_all('span', class_=lambda c: '_some_class1' in c))
    #Add span_2 & 3 here
0 голосов
/ 24 апреля 2020

Другое решение.

from simplified_scrapy import SimplifiedDoc,req,utils
html = '''
<div class="SOME_dIV">
     <span class="class_title">TITLE-1</span>
     <span class="_some_class1">VALUE-1</span>
     <span class="_some_class2">VALUE-2</span>
     <span class="_some_class3">VALUE-3</span>
</div>

<div class="SOME_dIV">
     <span class="class_title">TITLE-2</span>
     <span class="_some_class1">VALUE-10</span>
     <span class="_some_class2">VALUE-20</span>
     <span class="_some_class3">VALUE-30</span>
</div>

<div class="SOME_dIV">
     <span class="class_title">TITLE-3</span>
     <span class="_some_class1">VALUE-100</span>
     <span class="_some_class2">VALUE-200</span>
     <span class="_some_class3">VALUE-300</span>
</div>
'''
doc = SimplifiedDoc(html)
divs = doc.selects('div.SOME_dIV')
titles = divs.select('span.class_title')
for title in titles:
  print (title.text, title.nexts.text)

Результат:

TITLE-1 ['VALUE-1', 'VALUE-2', 'VALUE-3']
TITLE-2 ['VALUE-10', 'VALUE-20', 'VALUE-30']
TITLE-3 ['VALUE-100', 'VALUE-200', 'VALUE-300']

Вот еще несколько примеров. https://github.com/yiyedata/simplified-scrapy-demo/blob/master/doc_examples

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