Как спарсить одну и ту же информацию по уже извлеченным ссылкам?

Tamara1994

Новичок
Пользователь
Ноя 28, 2021
6
0
1
Я извлекла необходимую информацию с первой страницы (ячейка 1) и теперь ввожу код, чтобы программа прошлась по всем спарсенным раннее ссылкам и извлекла ту же информацию и по ним (ячейка 2). Но в выводе у меня почему-то просто дублируется второе значение из первой ссылки. Помогите, пожалуйста, разобраться!

Ячейка 1:
Languages = []
for title in soup.find_all("dl",{'class':'main-list large main-list-language-knowledge-level'}):
for tag in title.find_all('dd'):
Languages.append(tag.get_text())
Languages

Output:

['English', 'German']

Ячейка 2:

import time
Languages1 = []
for link in table ["Links"]:
response = requests.get(link, headers={'User-Agent':user_agent})
html_content = response.text
soup = bs(html_content, 'html.parser')
Languages1.append(tag.get_text())
time.sleep(5)
Languages1

Output:

['German',
'German',
'German',
'German',
'German',
'German',...]
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Код вставляйте как код с отступами (через кнопку </>).
Насколько я понял из вашего вопроса вы используйте jupyter notebook. В переменной tag у вас после цикла в первой ячейке сохранилось значение german, а во второй ячейке вы это значение не переназначайте и поэтому в список добавляется german на каждую итерацию цикла.
 
  • Мне нравится
Реакции: Tamara1994

Tamara1994

Новичок
Пользователь
Ноя 28, 2021
6
0
1
Код вставляйте как код с отступами (через кнопку </>).
Насколько я понял из вашего вопроса вы используйте jupyter notebook. В переменной tag у вас после цикла в первой ячейке сохранилось значение german, а во второй ячейке вы это значение не переназначайте и поэтому в список добавляется german на каждую итерацию цикла.
Спасибо! А вы можете подсказать, как перенести код из ячейки 1 в ячейку 2?

Я пробовала это сделать, но столкнулась со следующей проблемой:
Когда я переношу сам цикл во второй код, он у меня перестает работать. Так как цикл не присваивается к переменной. То есть я не могу написать text = (и перенести сюда функцию с циклом), чтобы потом добавить его к Languages1.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
как перенести код из ячейки 1 в ячейку 2?
Можно в первой ячейке сделать функцию, которая, например, принимает объект супа и выдает список текста из тегов:

Python:
def get_text_from_page(soup):
    Languages = []
    for title in soup.find_all("dl",{'class':'main-list large main-list-language-knowledge-level'}):
        for tag in title.find_all('dd'):
            Languages.append(tag.get_text())
    return Languages
а во второй ячейке добавлять в список Languages1 результаты выполнения этой функции:
Python:
import time


Languages1 = []
for link in table ["Links"]:
    response = requests.get(link, headers={'User-Agent':user_agent})
    html_content = response.text
    soup = bs(html_content, 'html.parser')
    Languages1 += get_text_from_page(soup)
    time.sleep(5)
 
  • Мне нравится
Реакции: Tamara1994

Tamara1994

Новичок
Пользователь
Ноя 28, 2021
6
0
1
Код вставляйте как код с отступами (через кнопку </>).
Насколько я понял из вашего вопроса вы используйте jupyter notebook. В переменной tag у вас после цикла в первой ячейке сохранилось значение german, а во второй ячейке вы это значение не переназначайте и поэтому в список добавляется german на каждую итерацию цикла.
А вы можете подсказать, как перенести код из ячейки 1 в ячейку 2?

Можно в первой ячейке сделать функцию, которая, например, принимает объект супа и выдает список текста из тегов:

Python:
def get_text_from_page(soup):
    Languages = []
    for title in soup.find_all("dl",{'class':'main-list large main-list-language-knowledge-level'}):
        for tag in title.find_all('dd'):
            Languages.append(tag.get_text())
    return Languages
а во второй ячейке добавлять в список Languages1 результаты выполнения этой функции:
Python:
import time


Languages1 = []
for link in table ["Links"]:
    response = requests.get(link, headers={'User-Agent':user_agent})
    html_content = response.text
    soup = bs(html_content, 'html.parser')
    Languages1 += get_text_from_page(soup)
    time.sleep(5)

Огромное вам спасибо!!! Вы мне очень помогли!

Могу я задать последний вопрос? У меня выгружается список языков, и когда я присваиваю его к своей таблице, у меня возникает ошибка, поскольку список языков превышает количество строк (у одного пользователя встречается более одного языка). Как я могу справиться с этой проблемой?


Python:
 table["Languages"] = Languages1
table

Output:
Length of values (148) does not match length of index (83)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Length of values (148) does not match length of index (83)
Чтобы длина совпадала можно в список Languages1 добавлять списки языков с каждой страницы, тогда получится список списков длина которого будет равна количеству ссылок.
Для этого можно заменить эту строку в коде
Python:
Languages1 += get_text_from_page(soup)
на такую
Python:
Languages1.append(get_text_from_page(soup))
 
  • Мне нравится
Реакции: Tamara1994

Tamara1994

Новичок
Пользователь
Ноя 28, 2021
6
0
1
Чтобы длина совпадала можно в список Languages1 добавлять списки языков с каждой страницы, тогда получится список списков длина которого будет равна количеству ссылок.
Для этого можно заменить эту строку в коде
Python:
Languages1 += get_text_from_page(soup)
на такую
Python:
Languages1.append(get_text_from_page(soup))
У меня все получилось! Я вам очень-очень благодарна!!!
 

Форум IT Специалистов