#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. Что ж, это было быстро! Большое спасибо, это действует как очарование. Я изучу, что вы там делали, и, надеюсь, узнаю из этого. Еще раз спасибо!