Beautiful Soup веб-скребковый комплекс html для данных - PullRequest
1 голос
/ 16 марта 2020

Хорошо, так что я работаю над самостоятельным проектом для моего курса по программированию в колледже. Мой план состоит в том, чтобы очистить различные части веб-сайта лиги по наблюдению для статистики и c, сохранить их в БД, а затем вытащить из этого БД с помощью бот-диска. Однако у меня проблемы с самим сайтом. Вот скриншот html для таблицы результатов .

Как вы можете видеть, это довольно запутанно и трудно ориентироваться с повторяющимися тегами div и body, и я уверен, что он создается динамически. Мой профессор порекомендовал мне найти способ выделить звание ранга в верхней части таблицы, а затем получить доступ к родительской строке, а затем перебрать братьев и сестер, чтобы извлечь данные, такие как имя команды, положение и т. Д. c, в словарь на данный момент. , Я не смог найти в Интернете ничего, что могло бы мне помочь, большинство веб-сайтов не предоставляют достаточно информации или устарели.

Вот что у меня есть:

from bs4 import BeautifulSoup
import requests
import link
import re
import pprint

url = 'https://overwatchleague.com/en-us/standings'

response = requests.get(url).text

page = BeautifulSoup(response, features='html.parser')



# for stat in page.find(string=re.compile("rank")):
#     statObject = {
#         'standing' : stat.find(string=re.compile, attrs={'class' : 'standings-table-v2styles__TableCellContent-sc-3q1or9-6 jxEkss'}).text.encode('utf-8')
#     }

# print(page.find_all('span', re.compile("rank")))  

# for tag in page.find_all(re.compile("rank")):
    # print(tag.name)

print(page.find(string=re.compile('rank')))

"""
# locate branch with the rank header,
# move up to the parent branch
# iterate through all the siblings and 
# save the data to objects
"""

Комментарии - все неудачные попытки и все ничего не возвращают. единственная не закомментированная строка возвращает массив json с большим количеством ненужной информации, которая включает в себя то, что я хочу проанализировать и использовать для моего проекта. Я связал его как Google Do c и выделил то, что я ищу, чтобы захватить.

Я не совсем уверен, как еще подойти к этому на данный момент. Я подумал об использовании селена, но мне не хватает javascript, поэтому я стараюсь избегать его, если это возможно. Даже если бы вы могли прокомментировать несколько советов о том, как еще подойти к этому, я был бы очень признателен.

Спасибо:)

1 Ответ

0 голосов
/ 16 марта 2020

Как вы заметили, ваши данные в формате JSON. Он встроен в тег скрипта прямо на странице, поэтому его легко получить с помощью . Затем вам нужно проанализировать json, чтобы извлечь все таблицы (соответствующие 3 вкладкам):

import requests
from bs4 import BeautifulSoup
import json

url = 'https://overwatchleague.com/en-us/standings'

r = requests.get(url)

soup = BeautifulSoup(r.text, "html.parser")
script = soup.find("script",{"id":"__NEXT_DATA__"})

data = json.loads(script.text)

tabs = [
    i.get("standings")["tabs"]
    for i in data["props"]["pageProps"]["blocks"] 
    if i.get("standings") is not None
]

result = [
    { i["title"] : i["tables"][0]["teams"] }
    for i in tabs[0]
]

print(json.dumps(result, indent=4, sort_keys=True))

Приведенный выше код дает вам словарь, ключи - это название 3 вкладок и значение таблицы данных

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