Очистка данных с использованием BS4 дает мне неожиданные результаты - PullRequest
2 голосов
/ 26 сентября 2019

Я не хочу раздражать вас своими самыми основными вопросами, но я застрял и надеюсь, что вы мне поможете.Я делал уроки и смотрел много видео, но не могу понять, что я делаю неправильно.Я хочу собрать данные из этой таблицы: https://www.youpriboo.com/vorher_102_main_nat.php?action=show&liga=2.BL

Это мой код:

import requests
from bs4 import BeautifulSoup

base_URL = 'https://www.youpriboo.com/vorher_102_main_nat.php?action=show&liga='
liga = '2.BL'
URL = base_URL + liga

headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36:'}

page = requests.get(URL, headers=headers)

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

for name in soup.find_all("td", class_="hac"):
    name1 = name.parent.find_all('td')[1] # team1 
    name2 = name.parent.find_all('td')[2] # team2
    wahr1 = name.parent.find_all('td')[6] # wahr1
    print(name1.get_text() +' '+ name2.get_text()+' '+ wahr1.get_text())

Проблема заключается в том, что он выдает мне данные 3 раза, а в списке 3the games.

Ожидаемый результат будет выглядеть следующим образом:

Armina Bielefeld VfB Stuttgart 34,43
SV Wehen Wiesbaden VfL Osnabrück 34,51
(and so on)

Спасибо за ваше время и работу!

Я разместил это также здесь: https://www.reddit.com/r/Python/comments/d9km7y/scraping_data_using_bs4_gives_me_unexpected/

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Вы можете очистить и записать результаты в CSV-файл несколькими различными способами.Я предпочитаю идти с пандами.Попробуйте использовать : has () , чтобы отфильтровать нежелательный контент.При этом должно работать следующее:

import requests
import pandas as pd
from bs4 import BeautifulSoup

base_URL = 'https://www.youpriboo.com/vorher_102_main_nat.php?action=show&liga='
liga = '2.BL'

URL = f"{base_URL}{liga}"

page = requests.get(URL, headers={"User-Agent": 'Mozilla/5.0'})
soup = BeautifulSoup(page.content, 'html.parser')

df = pd.DataFrame(columns=['Name_One','Name_Ano','Wahr'])
for tr in soup.select('.prognose_tab_1 tr:has(.greycell)'):
    name1 = tr.select('.hac')[1].get_text()
    name2 = tr.select('.hac')[2].get_text()
    wahr1 = tr.select('.greycell')[0].get_text()
    df = df.append({'Name_One':name1, 'Name_Ano':name2, 'Wahr':wahr1}, ignore_index=True)

    print(f"{name1} {name2} {wahr1}")

df.to_csv("youpriboo.csv", encoding='utf-8', index=False)
0 голосов
/ 26 сентября 2019

Попробуйте следующий код. Это даст вам ожидаемый результат.

import requests
from bs4 import BeautifulSoup

base_URL = 'https://www.youpriboo.com/vorher_102_main_nat.php?action=show&liga='
liga = '2.BL'
URL = base_URL + liga

headers = {
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36:'}

page = requests.get(URL, headers=headers)

soup = BeautifulSoup(page.content, 'html.parser')
table=soup.select_one(".prognose_tab_1")
for tr in table.select('tr'):
  if tr.select('.hac') and tr.select('.greycell'):
     name1=tr.select('.hac')[1]
     name2 = tr.select('.hac')[2]
     wahr1 = tr.select('.greycell')[0]

     print(name1.get_text() +' '+ name2.get_text()+' '+ wahr1.get_text())

Выход

Arminia Bielefeld VfB Stuttgart 34,43
SV Wehen Wiesbaden VfL Osnabrück 34,51
Jahn Regensburg Hamburger SV 24,18
Karlsruher SC 1. FC Heidenheim 37,70
VfL Bochum SV Darmstadt 98 55,22
Erzgebirge Aue Dynamo Dresden 37,70
FC St. Pauli SV Sandhausen 43,90
SpVgg Greuther Fürth Holstein Kiel 46,23
Hannover 96 1. FC Nürnberg 46,23
0 голосов
/ 26 сентября 2019

Фильтрация не правильная.Попробуйте этот подход,

table = soup.find_all("tr")
#print(table)
for row in table:
    data = row.find_all("td", class_="hac")
    if(len(data)>0):
        print(data[1].get_text(),data[2].get_text())

    data = row.find_all("td", class_="greycell")
    if(len(data)>0):
        print(data[0].get_text())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...