синтаксический анализ списка строк на основе значений в строке

#python #arrays #string

#python #массивы #строка

Вопрос:

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

 ['1n',
 ' Saul Alvarez*',
 '1545n',
 'nn',
 '  middlen',
 '  30n',
 ' 53xa01xa02n',
 ' n',
 'orthodoxn',
 'Guadalajara, Mexico',
 '2n',
 ' Tyson Fury',
 '1030n',
 'nn',
 '  heavyn',
 '  32n',
 ' 30xa00xa01n',
 ' n',
 'orthodoxn',
 'Wilmslow, United Kingdom',
 '3n',
 ' Errol Spence Jr',
 '697.2n',
 'nn',
 '  weltern',
 '  30n',
 ' 27xa00xa00n',
 ' n',
 'southpawn',
 'Desoto, USA',
 '4n',
 ' Terence Crawford',
 '658.9n',
 'nn',
 '  weltern',
...
 

У меня возникают трудности с анализом этого списка везде, где есть целое число ‘n’ .
Поэтому в идеале я хотел бы, чтобы результат представлял собой список списков :

 [[
'1n',
 ' Saul Alvarez*',
 '1545n',
 'nn',
 '  middlen',
 '  30n',
 ' 53xa01xa02n',
 ' n',
 'orthodoxn',
 'Guadalajara, Mexico'
],
['2n',
 ' Tyson Fury',
 '1030n',
 'nn',
 '  heavyn',
 '  32n',
 ' 30xa00xa01n',
 ' n',
 'orthodoxn',
 'Wilmslow, United Kingdom']
['3n',
 ' Errol Spence Jr',
 '697.2n',
 'nn',
 '  weltern',
 '  30n',
 ' 27xa00xa00n',
 ' n',
 'southpawn',
 'Desoto, USA'],
...]
 

Комментарии:

1. то есть вы имели в виду, что хотите, чтобы ваш первый список был преобразован во второй список? или, пожалуйста, уточните, или вы уверены, что каждый подсписок будет иметь одинаковую длину, равную 9?

Ответ №1:

Что ж, есть 2 вещи, которые происходят, и я остановлюсь только на первой.

Вы можете отбросить пробелы и 'n' потому, что это символы новой строки, то есть переводы строк.

 
li = ['1n',
 ' Saul Alvarez*',
 '1545n',
 'nn',
 '  middlen',
 '  30n',
 ' 53xa01xa02n',
 ' n',
 
]

li = [val.replace(r"n","") for val in li]
li = [val.strip() for val in li if val.strip()]

print(li)
 

Это выводит:

 ['1', 'Saul Alvarez*', '1545', 'middle', '30', '53xa01xa02']
 

Вторая проблема, которую я не буду здесь рассматривать, поскольку мы не знаем формат html, который вы не указали, заключается в том, что вы захватываете все значения элементов (текст в каждом теге), не глядя на структуру HTML-разметки. Это неправильный подход.

Я предполагаю, что если вы посмотрите на источник страницы, вы можете найти что-то вроде <div class="name">Saul Alvarez</div><div class="weightclass">middle</div> . Использование аннотации разметки и семантического контекста более продуктивно, чем пытаться угадать структуру из приведенного выше списка с 6 элементами. BeautifulSoup может сделать это, попробовав использовать soup.select("div.name") , например.

Хорошая вещь, с soup.select помощью которой используются селекторы CSS, заключается в том, что вы можете предварительно протестировать свой запрос в инструментах разработки вашего браузера.

Просто помните, soup.select что вернет список html-элементов, из которых вы захотите просмотреть value .