Вопросы по парсингу

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Всем доброго времени суток!
В очередной раз обращаюсь за помощью) Задача у меня следующая: есть страница сайта, где есть ссылки, ведущие на другие страницы и там тоже ссылки, ведущие на страницы. Для того, чтобы вытащить с этих вот страниц данные, мне нужен их список (чтобы программа по ним прошла).
Наглядно будет, наверно, со ссылками. Вот с этой страницы: https://gcn.gsfc.nasa.gov/gcn3_archive.html мне нужны все ссылки, у которых в адресе есть: "gcn3_arch_old". И чтобы список ссылок выглядел потом следующим образом: "https://gcn.gsfc.nasa.gov/gcn3_arch_old (+номер страницы).html". Я попыталась решить эту задачу несколькими способами, самым успешным оказался этот:
Python:
from bs4 import BeautifulSoup
import requests
import re

base_url = 'https://gcn.gsfc.nasa.gov/'

resp = requests.get('https://gcn.gsfc.nasa.gov/gcn3_archive.html')
soup = BeautifulSoup(resp.text, 'lxml')
lst_a = soup.find_all('a')
for i in lst_a:
href=i.get('href')
string=str(href)
print (base_url+string)

Но тут мне выдаются не только ссылки с "gcn3_arch_old", но и всякие другие. Наверно, это очень легко, но не пойму как именно и куда именно тут написать, чтоб среди всего найденного мне отбирались только ссылки с "gcn3_arch_old". Такой вот первый вопрос.

Второй вопрос касательно следующего списка ссылок. По моей идее я беру список, который формируется первым кодом, сохраняю его вручную в блокнотный файл, после чего даю его второму коду на обработку. Чтоб программа прошла по всем ссылками (следующего вида: https://gcn.gsfc.nasa.gov/gcn3_arch_old144.html) и выбрала оттуда из каждой такой ссылки только те, что в текстовых названиях содержат: "Konus-Wind detection" или "Konus-Wind observation" (например: <LI><A HREF=gcn3/26975.gcn3>26975</A> Konus-Wind observation of GRB 200131A<br> ). Для этого у меня следующий код:
Python:
from bs4 import BeautifulSoup
import requests
import re

with open("Links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    print(line)
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    lst = soup.find_all(lambda tag: tag.name == 'li' and ("Konus-Wind detection" in tag.text or "Konus-Wind observation" in tag.text))

base_url = "https://gcn.gsfc.nasa.gov/"
for li in lsti:
a = li.find('a')
print(base_url + a.attrs['href'] if a != -1 else '')

Но он не выбирает ссылки. Он по всем почему-то проходится. И на этом моменте я совсем запуталась(
Буду безмерно благодарна за любую помощь!
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
не претендую на правильность, в конце второго вопроса сделал срез строки, не нашел чет, как из вложенного тега href взять значение, может сами поищите найдете, перепишите, а так поставленную задачу выполняет, код ниже
Python:
from bs4 import BeautifulSoup
import requests
import re

# Первый вопрос
################################################################
list_url = []
base_url = 'https://gcn.gsfc.nasa.gov/'

resp = requests.get('https://gcn.gsfc.nasa.gov/gcn3_archive.html')
soup = BeautifulSoup(resp.text, 'lxml')
lst_a = soup.find_all('a')
for i in lst_a:
    href = i.get('href')
    string = str(href)
    if 'gcn3_arch_old' in string:
        print(base_url + string)
        list_url.append(base_url + string)
# Конец первого вопроса
################################################################


# Второй вопрос
################################################################
for line in list_url:
    response = requests.get(line)
    soup = BeautifulSoup(response.text, "lxml")
    links = soup.find_all('li')
    for link in links:
        if link.find(text=re.compile('Konus-Wind observation')) or link.find(text=re.compile('Konus-Wind detection')):
            print(base_url + str(link)[13:28].replace('"', ''))
# Конец второго вопроса
################################################################
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
не претендую на правильность, в конце второго вопроса сделал срез строки, не нашел чет, как из вложенного тега href взять значение, может сами поищите найдете, перепишите, а так поставленную задачу выполняет, код ниже
Python:
from bs4 import BeautifulSoup
import requests
import re

# Первый вопрос
################################################################
list_url = []
base_url = 'https://gcn.gsfc.nasa.gov/'

resp = requests.get('https://gcn.gsfc.nasa.gov/gcn3_archive.html')
soup = BeautifulSoup(resp.text, 'lxml')
lst_a = soup.find_all('a')
for i in lst_a:
    href = i.get('href')
    string = str(href)
    if 'gcn3_arch_old' in string:
        print(base_url + string)
        list_url.append(base_url + string)
# Конец первого вопроса
################################################################


# Второй вопрос
################################################################
for line in list_url:
    response = requests.get(line)
    soup = BeautifulSoup(response.text, "lxml")
    links = soup.find_all('li')
    for link in links:
        if link.find(text=re.compile('Konus-Wind observation')) or link.find(text=re.compile('Konus-Wind detection')):
            print(base_url + str(link)[13:28].replace('"', ''))
# Конец второго вопроса
################################################################
Спасибо огромное!! Все просто отлично))) А, может, есть способ как этот список ссылок сохранить в блокнотный файл автоматически, а не вручную?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 648
472
83
я не понял что вы подразумеваете под сохранить вручную, то есть копипасить каждую ссылку руками?
вот с сохранением ссылок в файл, код ниже
Python:
from bs4 import BeautifulSoup
import requests
import re

# Первый вопрос
################################################################
list_url = []
base_url = 'https://gcn.gsfc.nasa.gov/'

resp = requests.get('https://gcn.gsfc.nasa.gov/gcn3_archive.html')
soup = BeautifulSoup(resp.text, 'lxml')
lst_a = soup.find_all('a')
for i in lst_a:
    href = i.get('href')
    string = str(href)
    if 'gcn3_arch_old' in string:
        print(base_url + string)
        list_url.append(base_url + string)
        with open('links.txt', 'a') as f:
            f.write(base_url + string + '\n')
# Конец первого вопроса
################################################################


# Второй вопрос
################################################################
for line in list_url:
    response = requests.get(line)
    soup = BeautifulSoup(response.text, "lxml")
    links = soup.find_all('li')
    for link in links:
        if link.find(text=re.compile('Konus-Wind observation')) or link.find(text=re.compile('Konus-Wind detection')):
            print(base_url + str(link)[13:28].replace('"', ''))
            with open('links.txt', 'a') as f:
                f.write(base_url + str(link)[13:28].replace('"', '') + '\n')
# Конец второго вопроса
################################################################
 
Последнее редактирование:
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
я не понял что вы подразумеваете под сохранить вручную, то есть копипасить каждую ссылку руками?
вот с сохранением ссылок в файл, код ниже
Python:
from bs4 import BeautifulSoup
import requests
import re

# Первый вопрос
################################################################
list_url = []
base_url = 'https://gcn.gsfc.nasa.gov/'

resp = requests.get('https://gcn.gsfc.nasa.gov/gcn3_archive.html')
soup = BeautifulSoup(resp.text, 'lxml')
lst_a = soup.find_all('a')
for i in lst_a:
    href = i.get('href')
    string = str(href)
    if 'gcn3_arch_old' in string:
        print(base_url + string)
        list_url.append(base_url + string)
        with open('links.txt', 'a') as f:
            f.write(base_url + string + '\n')
# Конец первого вопроса
################################################################


# Второй вопрос
################################################################
for line in list_url:
    response = requests.get(line)
    soup = BeautifulSoup(response.text, "lxml")
    links = soup.find_all('li')
    for link in links:
        if link.find(text=re.compile('Konus-Wind observation')) or link.find(text=re.compile('Konus-Wind detection')):
            print(base_url + str(link)[13:28].replace('"', ''))
            with open('links.txt', 'a') as f:
                f.write(base_url + str(link)[13:28].replace('"', '') + '\n')
# Конец второго вопроса
################################################################
Ну да, я копипастила вручную) Копировать-вставь. Спасибо Вам еще раз!) Вы не первый раз мне помогаете, я очень благодарна))
 

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