Цикл по элементу в BeautifulSoup, но вывод только дочерних элементов указанного элемента - PullRequest
1 голос
/ 30 апреля 2019

Моя текущая проблема состоит в том, чтобы определить, как использовать BeautifulSoup и Selenium для веб-очистки веб-сайта киберспорта под названием Rocket League eSports.

Я могу найти данные и использую Selenium из-за сценариев, используемых на их веб-странице. Затем я использую BeautifulSoup, чтобы получить данные. Отсюда я могу экспортировать все названия команд, но при добавлении в список я получаю «Нет».

from selenium import webdriver
from bs4 import BeautifulSoup
#import soupsieve
import time

#create a Google Chrome session
browser = 
webdriver.Chrome(executable_path='/home/jdr1018/chromedriver')

#maximizes Google Chrome window
browser.maximize_window()

#fetches the URL
browser.get('https://www.rocketleagueesports.com/stats/')

#pause to allow page to load
time.sleep(4)

#search the container and find all elements with h5 tag to print 
given elements
#container = browser.find_elements_by_tag_name('h5')

#hand over Selenium page source to Beautiful BeautifulSoup
soup_source = BeautifulSoup(browser.page_source, 'lxml')

namelist = [] #empty list for Team names

winpercentlist = [] #empty list for Win Percentage

rocketleaguedict = {} #empty dict for namelist + winpercentlist

#using XPath to find h5 element with class name and assinging it to 
teamnames
elements = browser.find_elements_by_xpath('//h5[@class="name"]/a')
teamnames = [element.text for element in elements]
#loop through team names to get each individual team name
for name in teamnames:
    #if statement to determine if name is already in the list
    if name in namelist:
        #append each team name through loop into empty list.
        pass
    else:
        namelist.append(name)
#return namelist to verify
return namelist
#for i in container:
   #print(i.get_attribute("innerHTML"))

#once program is done close Google Chrome
browser.close()}

Мой вывод выглядит примерно так:

['CHIEFS ESPORTS CLUB']
['CHIEFS ESPORTS CLUB', 'NRG ESPORTS']
['CHIEFS ESPORTS CLUB', 'NRG ESPORTS', 'ICON ESPORTS']
['CHIEFS ESPORTS CLUB', 'NRG ESPORTS', 'ICON ESPORTS', 'RENAULT SPORT 
TEAM VITALITY']
['CHIEFS ESPORTS CLUB', 'NRG ESPORTS', 'ICON ESPORTS', 'RENAULT SPORT 
TEAM VITALITY', 'ERODIUM']
['CHIEFS ESPORTS CLUB', 'NRG ESPORTS', 'ICON ESPORTS', 'RENAULT SPORT 
TEAM VITALITY', 'ERODIUM', 'LOWKEY ESPORTS'] ...

Это не совсем так, но дело в том, что они куча этих "Ни одного", и я не могу точно понять, почему.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Используйте это:

elements = browser.find_elements_by_xpath('//h5[@class="name"]/a')
teamnames = [element.text for element in elements]

Объяснение, почему ваш подход не сработал:

В вашем решении много None, так как значения в столбцах «G», «G / GM» и т. Д.также имеют одинаковые html-тэг и класс.

enter image description here

В результате teamnames представляет собой список элементов, который содержит числа, и в них нет содержания <a href>...</a> html.Вызов метода name.find('a') возвращает None, когда такого элемента нет ( ссылка на документацию BeautifulSoup по find () ), следовательно, вы получаете серию 6 None.

0 голосов
/ 30 апреля 2019

Вы можете использовать регулярные выражения и запросы, чтобы получить имена команд.Регулярное выражение, вероятно, можно сделать еще более эффективным (я был бы признателен за это)

import requests
import re

res = requests.get('https://www.rocketleagueesports.com/ajax/standings-script/?league=7-57d5ab4-qm0qcw&season=7-cab6afe099-06tjgk&region=0&stage=7-57d5ab4-g1dsq3')
r = re.compile(r'name: "((?:(?!").)*)')
teams = r.findall(res.text)

Пример вывода:

image


Регулярное выражение:

Просмотреть регулярное выражение и объяснение здесь

В основном оно предназначено для строк в теге сценария, которые имеютформат name: "TeamName".Негативное предположение - убедиться, что я получаю каждое название команды как группу, останавливаясь на «после названия команды; в отличие от одного длинного матча, заканчивающегося на» после последнего названия команды.

enter image description here

Дополнительные ссылки:

  1. https://www.regular -expressions.info / tutorial.html
  2. https://www.regular -expressions.info / lookaround.html
...