Próbowałem spojrzeć na to na stackoverflow, ale nie mogłem sprawić, że pasuje do mojego kodu. Być może ktoś może mi w tym pomóc?

Próbuję zdobyć "Team1", "Team2" i "Bettext'-atrybut" z tego HTML:

<table class="sportbet_extra_list_table" id="mc-ga312004790">
    <tbody>
        <tr>
            <td class="sportbet_extra_c0"></td>
            <td class="sportbet_extra_c1"><span>
                <a class="combi_1"></a>
                Hvem vinder kampen?                            </span></td>
            <td class="sportbet_extra_c2">
			                <div id="mc-ti312004790_1" class="js-ti312004790_1 sportbet_extra_rate_content" onclick="Bettingslip.addBet({type: 'N', team1: 'Rusland', team2: 'Saudi Arabien', bettext: 'Hvem vinder kampen?', combi_cat: 1, sub_group: 0, game: 312004790, groupId:461392, leagueId:30124, odd: 138, odd_id: 312004790, tiptext: '1', tip: 1, betstyle: 2224})">
                    <div class="sportbet_content_rate_left">1</div>
                    <div class="sportbet_content_rate_right">1,38</div>
                </div>
				
            </td>

Do tej pory ten kod jest tym, czego używam do wyodrębniania informacji z SPORTBET_EXTRA_LIST_TABLE:

    REQUEST = requests.get('https://www.cashpoint.dk/en/? 
              r=bets/xtra&group=461392&game=312004790').text
    SOUP = BeautifulSoup(REQUEST, 'lxml')
    # find_all to extract all
    SCRAPE = SOUP.find('table', class_='sportbet_extra_list_table')

    for CLEAN in SCRAPE:
        CLEANER = BeautifulSoup(str(CLEAN), 'lxml').text
        STRIP = " ".join(line.strip() for line in CLEANER.split("\n"))
        print(STRIP)

Próbowałem dodać

SOUP.find('table', class_='sportbet_extra_list_table', attrs={"onclick": "team1"})

Ale to nie zadziałało

-1
user2939562 2 czerwiec 2018, 11:21

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć demjson.decode() Aby przekonwertować surowe obiekty JavaScript w słowniki Pythona. Ułatwia uzyskanie określonych danych o postawie.

Kod:

import re
import demjson
import requests
from bs4 import BeautifulSoup

r = requests.get('https://www.cashpoint.dk/en/'
                 '?r=bets/xtra'
                 '&group=461392'
                 '&game=312004790')

soup = BeautifulSoup(r.text, 'lxml')
tables = soup.select('table.sportbet_extra_list_table')

for table in tables:
    fields = table.select('.sportbet_extra_rate_content')
    for field in fields:
        js_obj = re.search('{.+}', field['onclick']).group()
        bet = demjson.decode(js_obj)
        print((bet['team1'], bet['team2'], bet['bettext'], bet['tiptext'], bet['tip']))

Wynik:

('Rusland', 'Saudi Arabien', 'Hvem vinder kampen?', '1', 1)
('Rusland', 'Saudi Arabien', 'Hvem vinder kampen?', 'X', 3)
('Rusland', 'Saudi Arabien', 'Hvem vinder kampen?', '2', 2)
('Rusland', 'Saudi Arabien', 'Dobbeltchance', '1x', 1)
...
('Rusland', 'Saudi Arabien', 'Scorer i begge HL', 'B', 2)
0
radzak 2 czerwiec 2018, 15:42

Oto rozwiązanie problemu:

SCRAPE = SOUP.find('table', class_='sportbet_extra_list_table')
# Get the content of the onclick attribute using ['onclick']
SCRAPE = SCRAPE.find('div', id="mc-ti312004790_1")['onclick']
# Now separate every variable in it
attrs = SCRAPE.split(',')
# Retrieve what you want
team1 = attrs[1].split(':')[1].replace(' ', '').replace('\'', '')
team2 = attrs[2].split(':')[1].replace(' ', '').replace('\'', '')
bettext = attrs[3].split(':')[1].replace(' ', '').replace('\'', '')

print(team1)
print(team2)
print(bettext)

Wyjścia:

Rusland.

Saudirabien

Hvemvinderkampen?

Zmienna attri wygląda tak:

["Bettingslip.addbet ({Type:" N '"," Team1: "Rusland" "," Team2: "Saudyjska" "," Bettext: "Vinder Hvem Kampen?", "Combii_cat: 1", "Sub_group : 0 ', "Gra: 312004790", "Groupid: 461392", "Leagueid: 30124", "Odd: 138", "Odd_id: 312004790", "Tiptlext:" 1' "," Wskazówka: 1 "," Betstyle : 2224}) ']

Atus [1] zmienna to:

"Team1:" Rusland "

Robić .Split (':') daje:

['"Team1", "" Rusland "]

Aby uzyskać nazwę Team1, weźmiemy attrów [1] .Split (": ') [1], daje:

"Rusland"

Robić .replace ('', '') Usuń przestrzenie i robi

-1
nero 2 czerwiec 2018, 08:53

Spróbuj wykonać następujące czynności, aby uzyskać sposób, w jaki wspomniałeś w swoim poście:

import json
import requests 
from bs4 import BeautifulSoup

url = "https://www.cashpoint.dk/en/?r=bets/xtra&group=461392&game=312004790"

res = requests.get(url)
soup = BeautifulSoup(res.text,'lxml')

dataset = []
for items in soup.select("#container_xtra [id^='mc-ti']"):
    d = {}
    data = items.get("onclick").split("Bettingslip.addBet(")[1].split(")")[0]

    d['team1'] = data.split("team1:")[1].split(",")[0].split("'")[1].split("'")[0]
    d['team2'] = data.split("team2:")[1].split(",")[0].split("'")[1].split("'")[0]
    d['bettext'] = data.split("bettext:")[1].split(",")[0].split("'")[1].split("'")[0]
    if d not in dataset:
        dataset.append(d)

print(json.dumps(dataset,indent=4))

Częściowy wynik:

[
    {
        "team1": "Rusland",
        "team2": "Saudi Arabien",
        "bettext": "Hvem vinder kampen?"
    },
    {
        "team1": "Rusland",
        "team2": "Saudi Arabien",
        "bettext": "Dobbeltchance"
    },
0
SIM 2 czerwiec 2018, 15:49