Как перебрать все имена пользователей? - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы очистить все статистические данные MLB за 2018. Вот мой код:

#import modules

from urllib.request import urlopen
from lxml import html

#fetch url/html

response = urlopen("https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml")
content = response.read()
tree = html.fromstring( content )

#parse data

comment_html = tree.xpath('//comment()[contains(., "players_standard_batting")]')[0]
comment_html = str(comment_html).replace("-->", "")
comment_html = comment_html.replace("<!--", "")
tree = html.fromstring( comment_html )
for batter_row in tree.xpath('//table[@id="players_standard_batting"]/tbody/tr[contains(@class, "full_table")]'):
    csk = batter_row.xpath('./td[@data-stat="player"]/@csk')[0]

Когда я очищал все тестеры, к каждому имени добавлялось 0,01.Я попытался удалить прикрепленные номера, используя следующий код:

bat_data = [csk]
string = '0.01'
result = []

for x in bat_data :
    if string in x:
        substring = x.replace(string,'')
        if substring != "":
            result.append(substring)
    else:
        result.append(x)
print(result)

Этот код удалил номер, однако была напечатана только фамилия:

Вывод:

['Zunino, Mike']

Кроме того, вокруг названия есть скобка и цитаты.Название также в обратном порядке.

1) Как я могу напечатать все имена участников?

2) Как убрать кавычки и скобки?

3) Можно ли изменить порядокимена, так что имя будет напечатано, а затем фамилия?

Окончательный результат, на который я надеюсь, будет именами всех участников: Mike Zunino.

Я новичок в этом сайте ... Я также новичок в чистке / кодировании ибуду очень признателен за любую помощь, которую я могу получить!=) * +1022 *

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы получаете только последний тест, потому что вы перезаписываете значение csk каждый раз в первом цикле.Сначала инициализируйте пустой список bat_data, а затем добавьте в него каждое тесто.

bat_data= []
for batter_row in blah:
    csk = blah
    bat_data.append(csk)

Это даст вам список всех тестов, ['Abreu,Jose0.01', 'Acuna,Ronald0.01', 'Adam,Jason0.01', ...]

Затем выполните цикл по этому списку, но вы неНе нужно проверять, если string в названии.Просто сделайте x.replace('0.01', '') и проверьте, не является ли строка пустой.

Чтобы изменить порядок имен

substring = substring.split(',')
substring.reverse()
nn = " ".join(substring)

Затем добавьте nn к результату.

Выполучают кавычки и скобки, потому что вы печатаете список.Вместо этого переберите список и распечатайте каждый элемент.

Ваш код отредактирован, если вы правильно получили bat_data:

for x in bat_data :
    substring = x.replace(string,'')
    if substring != "":
        substring = substring.split(',')
        substring.reverse()
        substring = ' '.join(substring)
        result.append(substring)

for x in result:
    print(x)
0 голосов
/ 20 сентября 2018

Вы можете сделать то же самое по-разному.Вот один из таких подходов, который не требует последующей обработки.Вы получаете имена, которые вы хотели получить:

from urllib.request import urlopen
from lxml.html import fromstring

url = "https://www.baseball-reference.com/leagues/MLB/2018-standard-batting.shtml"

content = str(urlopen(url).read())
comment = content.replace("-->","").replace("<!--","")
tree = fromstring(comment)
for batter_row in tree.xpath('//table[contains(@class,"stats_table")]//tr[contains(@class,"full_table")]'):
    csk = batter_row.xpath('.//td[@data-stat="player"]/a')[0].text
    print(csk)

Вывод, который вы можете получить как:

Jose Abreu
Ronald Acuna
Jason Adam
Willy Adames
Austin L. Adams
0 голосов
/ 20 сентября 2018

1) Печать всех имен тестов

print(result)

Это напечатает все в объекте результата.Если он не печатает то, что вы ожидаете, тогда происходит что-то еще не так.

2) Уберите цитаты Скобки из-за того, что это объект массива.Попробуйте это ...

print(result[0])

Это скажет переводчику распечатать результат с индексом 0.

3) Обратный порядок имен

Попробуйте

name = result[0].split(“ “).reverse()[::-1]
...