Удаление символов новой строки в веб-царапинах - PullRequest
2 голосов
/ 11 апреля 2019

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

'D. Fletcher'

, но вместо этого я получаю

'LF\nD. Fletcher\nR'

Кроме того, он дает мне всех игроков на странице.Было бы предпочтительнее, чтобы я сгруппировал их по командам, для которых, возможно, требуется какой-то словарь, но я не уверен, как будет выглядеть этот код.

Я пытался использовать функцию strip, но я считаю, что она устраняет только начальные или конечные проблемы, а не в середине.Я пытался выяснить, как получить информацию о заголовке из тега привязки, но не понял, как это сделать.

from bs4 import BeautifulSoup
import requests


url = 'https://www.rotowire.com/baseball/daily_lineups.htm'

r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

players = soup.find_all('li', {'class': 'lineup__player'})

####for link in players.find('a'):
#####   print (link.string)

awayPlayers = [player.text.strip() for player in players]
print(awayPlayers)

Ответы [ 4 ]

2 голосов
/ 11 апреля 2019

Вы должны получить только .text для тега a, а не целое li:

awayPlayers = [player.find('a').text.strip() for player in players]

Это приведет к чему-то вроде следующего:

['L. Martin', 'Jose Ramirez', 'J. Luplow', 'C. Santana', ...
1 голос
/ 11 апреля 2019

Скажем, вы хотели создать этот диктат с именами команд и игроков, которые вы могли бы сделать примерно так: Я не знаю, хотите ли вы выделенных игроков, например Тревор Бауэр? Я добавил переменные для хранения их в случае необходимости.

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

from bs4 import BeautifulSoup as bs
import requests

r = requests.get('https://www.rotowire.com/baseball/daily-lineups.php')
soup = bs(r.content, 'lxml')
team_dict = {}

teams = [item.text for item in soup.select('.lineup__abbr')] #26

matches = {}
i = 0
for teambox in soup.select('.lineups > div:not(.is-ad, .is-tools)'):
    team_visit = teams[i]
    team_home = teams[i + 1]
    highlights = teambox.select('.lineup__player-highlight-name a')
    visit_highlight = highlights[0].text
    home_highlight = highlights[1].text
    match = team_visit + ' v ' + team_home
    visitors = [item['title'] for item in teambox.select('.is-visit .lineup__player [title]')]
    home = [item['title'] for item in teambox.select('.is-home .lineup__player [title]')]
    matches[match] = {'visitor' : [{team_visit : visitors}] ,
                      'home' : [{team_home : home}]
                     }
    i+=1

Пример информации:

enter image description here


Текущая структура:

image

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

Я думаю, что вы были почти у цели, вам просто нужно немного подправить:

 awayPlayers = [player.find('a').text for player in players]

Это понимание списка захватит только имена из списка, а затем вытянет текст из якоря ...вы получите просто список имен:

['L. Martin',
 'Jose Ramirez',
 'J. Luplow'...]
0 голосов
/ 11 апреля 2019

Вы должны найти тег a и атрибут title в нем, проверьте ответ ниже.

awayPlayers = [player.find('a').get('title') for player in players]
print(awayPlayers)

Вывод:

['Leonys Martin', 'Jose Ramirez', 'Jordan Luplow', 'Carlos Santana',
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...