Соскребайте новости с помощью BeautifulSoup

#python #beautifulsoup

Вопрос:

я пытаюсь удалить новостные статьи с веб-сайта. Меня интересуют только статьи, которые содержат а <span class="news_headline"> с текстом «Переводы». Из этой статьи я хочу извлечь текст внутри промежутков <div class="news_text"> . Результат должен закончиться в csv-файле и выглядеть примерно так:

 R.Wolf; wechselt für 167.000 von Computer zu; Hauke  
Weiner; wechselt für 167.000 von Computer zu; Hauke  
Gonther; wechselt für 770.000 von Computer zu; Hauke 
 

или

 3378; wechselt für 167.000 von Computer zu; 514102  
3605; wechselt für 167.000 von Computer zu; 514102  
1197; wechselt für 770.000 von Computer zu; 514102
 

Я очень новичок в программировании, поэтому надеюсь, что кто-нибудь сможет помочь.

 <div class="single_news_container">
    <div class="news_body_right single_news_content">
        <div class="cont_news_headlines">
          <span class="wrapper_news_headlines">
            <span class="news_headline">Transfers</span>
          </span>
        </div>
        <div class="news_text">
            <div>
                <p>
                    <span><a href="/2.bundesliga/players/R. Wolf-3378">R. Wolf</a> wechselt für 167.000 von Computer zu <a href="/users/514102">Hauke</a></span>
                </p>
                <p>
                    <span><a href="/2.bundesliga/players/Weiner-3605">Weiner</a> wechselt für 167.000 von Computer zu <a href="/users/514102">Hauke</a></span>
                </p>
                <p>
                    <span><a href="/2.bundesliga/players/Gonther-1197">Gonther</a> wechselt für 770.000 von Computer zu <a href="/users/514096">Christoph</a></span>
                </p>
            </div>
        </div>
    </div>
</div>
 

Ответ №1:

Во-первых, проверьте вложенную структуру html-кода. Вы увидите, что данные, которые вы хотите очистить, не завернуты в div то, что вы упомянули, скорее, они оба завернуты <div class="news_body_right single_news_content"> . Поэтому вам следует запустить a find_all на этом div , а затем просмотреть результаты, чтобы проверить, содержит ли в них div заголовок новостей «Переводы». Только после этого вы можете извлечь данные, например, заполнив пустой список, а затем загрузив его pandas и сохранив в csv :

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

 from bs4 import BeautifulSoup
import pandas as pd

html='''<div class="single_news_container">
<div class="news_body_right single_news_content">
    <div class="cont_news_headlines">
      <span class="wrapper_news_headlines">
        <span class="news_headline">Transfers</span>
      </span>
    </div>
    <div class="news_text">
        <div>
            <p>
                <span><a href="/2.bundesliga/players/R. Wolf-3378">R. Wolf</a> wechselt für 167.000 von Computer zu <a href="/users/514102">Hauke</a></span>
            </p>
            <p>
                <span><a href="/2.bundesliga/players/Weiner-3605">Weiner</a> wechselt für 167.000 von Computer zu <a href="/users/514102">Hauke</a></span>
            </p>
            <p>
                <span><a href="/2.bundesliga/players/Gonther-1197">Gonther</a> wechselt für 770.000 von Computer zu <a href="/users/514096">Christoph</a></span>
            </p>
        </div>
    </div>
</div>'''

soup = BeautifulSoup(html,'html.parser')

data = []

for news in soup.find_all("div", class_="news_body_right single_news_content"):
  if 'Transfers' in news.find("span", class_="news_headline"):
    for i in news.find("div", class_="news_text").find_all('span'):
      subject = i.find_all('a')[0].get_text()
      amount = i.get_text().split('für ', 1)[1].split(' von')[0].replace('.','').replace(',','.')
      from_player = i.get_text().split('von ', 1)[1].split(' zu')[0]
      to_player = i.find_all('a')[1].get_text()
      data.append({'subject': subject, 'amount': amount, 'from_player': from_player, 'to_player': to_player})

df = pd.DataFrame(data)
df.to_csv('output.csv')
 

Результат:

предмет сумма от_плеера to_player
0 Р. Вольф 167000 Компьютер Hauke
1 Вайнер 167000 Компьютер Hauke
2 Гонтер 770000 Компьютер Кристоф

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

1. Что ж, это было быстро! Большое спасибо, это действует как очарование. Я изучу, что вы там делали, и, надеюсь, узнаю из этого. Еще раз спасибо!