Как я могу запустить команду python, которая нажимала бы на каждую ссылку на странице и извлекала заголовок, содержимое и дату для каждой ссылки?

#python #html #selenium #web-scraping #beautifulsoup

#python #HTML #selenium #веб-очистка #beautifulsoup

Вопрос:

Используя эту ссылку: https://1997-2001.state.gov/briefings/statements/2000/2000_index.html . У меня есть команда, которая нажимает на каждую ссылку на странице и извлекает все данные, но я хотел бы преобразовать это в файл csv, и поэтому мне нужно выполнить три разные команды, которые бы дали мне заголовок, абзацы и даты каждой статьи на странице (чтобы они отображались).могут быть столбцы на листе Excel). У меня возникли трудности, потому что на этой странице нет «класса» или «идентификатора». Любые предложения были бы очень полезны.

Вот мой текущий код:

     url = 'https://1997-2001.state.gov/briefings/statements/2000/2000_index.html'
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')

    for a in soup.select('td[width="580"] img   a')[400:]:
    u = 'https://1997-2001.state.gov/briefings/statements/2000/'   a['href'] 
    print(u)
    s = BeautifulSoup(requests.get(u).content, 'html.parser')
    t = s.select_one('td[width="580"], td[width="600"], table[width="580"]:has(td[colspan="2"])').get_text(strip=True, separator='n')
    print( t.split('[end of document]')[0] )
    print('-' * 80)
  

Ответ №1:

Вы можете использовать этот скрипт для сохранения данных в CSV:

 import requests
import pandas as pd
from bs4 import BeautifulSoup


url = 'https://1997-2001.state.gov/briefings/statements/2000/2000_index.html'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

all_data = []
for a in soup.select('td[width="580"] img   a'):
    date = a.text.strip(':')
    title = a.find_next_sibling(text=True).strip(': ')   
    u = 'https://1997-2001.state.gov/briefings/statements/2000/'   a['href'] 
    print(u)
    s = BeautifulSoup(requests.get(u).content, 'html.parser')
    t = s.select_one('td[width="580"], td[width="600"], table[width="580"]:has(td[colspan="2"])').get_text(strip=True, separator='n')
    content = t.split('[end of document]')[0]
    print(date, title, content)
    all_data.append({
        'url': u,
        'date': date,
        'title': title,
        'content': content
    })
    print('-' * 80)

df = pd.DataFrame(all_data)
df.to_csv('data.csv', index=False)
print(df)
  

С принтами:

 ...

                                                   url  ...                                            content
0    https://1997-2001.state.gov/briefings/statemen...  ...  Statement by Philip T. Reeker, Deputy Spokesma...
1    https://1997-2001.state.gov/briefings/statemen...  ...  Media NotenDecember 26, 2000nRenewal of the ...
2    https://1997-2001.state.gov/briefings/statemen...  ...  Statement by Philip T. Reeker, Deputy Spokesma...
3    https://1997-2001.state.gov/briefings/statemen...  ...  Notice to the PressnDecember 21, 2000nMeetin...
4    https://1997-2001.state.gov/briefings/statemen...  ...  Statement by Philip T. Reeker, Deputy Spokesma...
..                                                 ...  ...                                                ...
761  https://1997-2001.state.gov/briefings/statemen...  ...  Press Statement by James P. Rubin, Deputy Spok...
762  https://1997-2001.state.gov/briefings/statemen...  ...  Press Statement by James P. Rubin, Spokesmann...
763  https://1997-2001.state.gov/briefings/statemen...  ...  Notice to the PressnJanuary 6, 2000nAssistan...
764  https://1997-2001.state.gov/briefings/statemen...  ...  Press Statement by James P. Rubin, Spokesmann...
765  https://1997-2001.state.gov/briefings/statemen...  ...  Press Statement by James P. Rubin, Spokesmann...

[766 rows x 4 columns]
  

и сохраняет data.csv (скриншот из LibreOffice):

введите описание изображения здесь


РЕДАКТИРОВАТЬ: для 1998 года:

 import requests
import pandas as pd
from bs4 import BeautifulSoup


url = 'https://1997-2001.state.gov/briefings/statements/1998/1998_index.html'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

all_data = []
for a in soup.select('td[width="580"] img   a, blockquote img   a'):
    date = a.text.strip(':')
    title = a.find_next_sibling(text=True).strip(': ')   
    u = 'https://1997-2001.state.gov/briefings/statements/1998/'   a['href'] 
    print(u)
    s = BeautifulSoup(requests.get(u).content, 'html.parser')
    if not s.body:
        continue
    t = s.select_one('td[width="580"], td[width="600"], table[width="580"]:has(td[colspan="2"]), blockquote, body').get_text(strip=True, separator='n')
    content = t.split('[end of document]')[0]
    print(date, title, content)
    all_data.append({
        'url': u,
        'date': date,
        'title': title,
        'content': content
    })
    print('-' * 80)

df = pd.DataFrame(all_data)
df.to_csv('data.csv', index=False)
print(df)
  

Комментарии:

1. Большое спасибо, это сработало! Поскольку вы, похоже, являетесь экспертом в этом, знаете ли вы, в чем проблема со структурой этой ссылки: 1997-2001.state.gov/briefings/statements/1998/1998_index.html и почему кажется, что он не запускает тот же сценарий (ни печать содержимого, ни преобразование в csv, и ошибок нет)?

2. Итак, я также попытался использовать этот скрипт для очистки этой ссылки: 1997-2001.state.gov/statements/2000_index.html , но ничего не запускалось, и ошибки не было, вы знаете, какие различия в структуре или что нужно изменить в сценарии?