BeautifulSoup: извлечь атрибут из элемента? - PullRequest
0 голосов
/ 02 июня 2018

Я пытался найти это в Stackoverflow, но не смог вписать его в мой код.Возможно, кто-то может помочь мне в этом?

Я пытаюсь получить атрибуты 'team1', 'team2' и 'bettext' из этого 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>

Пока этот код используется для извлечения информации из 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)

Я пытался добавить

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

Но это не сработало

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Попробуйте следующее, чтобы получить результат, который вы упомянули в своем сообщении:

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))

Частичный результат:

[
    {
        "team1": "Rusland",
        "team2": "Saudi Arabien",
        "bettext": "Hvem vinder kampen?"
    },
    {
        "team1": "Rusland",
        "team2": "Saudi Arabien",
        "bettext": "Dobbeltchance"
    },
0 голосов
/ 02 июня 2018

Вы можете использовать demjson.decode() для преобразования необработанных объектов JavaScript в словари Python.Это значительно упрощает получение конкретных данных о ставке.

Код:

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']))

Вывод:

('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 голосов
/ 02 июня 2018

Вот решение вашей проблемы:

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)

Выходные данные:

Русланд

SaudiArabien

Хвемвиндеркампен?

Переменная attrs выглядит следующим образом:

["Bettingslip.addBet ({type: 'N'", "team1: 'Rusland'", "team2: 'SaudiArabien '"," 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})']

Переменная attrs [1]:

"team1: 'Rusland'"

выполнение .split (':') дает:

['"team1", "' Rusland""]

чтобы получить имя команды1, мы возьмем attrs [1] .split (':') [1], это даст:

" 'Rusland'"

Выполнение .replace ('', '') удаляет пробелы, а выполнение .replace ('\' ',' ') удаляет" "".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...