Поиск строки в списке - PullRequest
0 голосов
/ 21 апреля 2020

Так сильно застрял

Во-первых, мой HTML очень тяжелый. Иногда в нем отсутствуют данные, как показано ниже. Моя цель - получить текст после сильного (так ХОРОШО, 1: 56: 5, 1: 56,5 и т. Д. c и т. c).

Поскольку данные перемешаны, я потенциально хочу вложенные операторы if, поэтому при построении списка мои данные верны (см. Код ниже)

Отсутствуют данные HTML

<td><strong>Track Rating:</strong> GOOD</td>
<td></td>
<td><strong>Gross Time:</strong> 1:56:5</td>
<td><strong>Mile Rate:</strong> 1:56:5</td>

Обычный HTML

<td><strong>Track Rating:</strong> GOOD</td>
<td><strong>Gross Time:</strong> 2:29:6</td>
<td><strong>Mile Rate:</strong> 1:58:6</td>
<td><strong>Lead Time:</strong> 30.3</td>

Мой код находится ниже, где я хочу извлечь данные из моего оператора if, но я застрял. Любая помощь приветствуется. То, что я пытаюсь сделать, это собрать ХОРОШО здесь и сохранить его в трекинге и делать это для каждого рейтинга отслеживания, который я выбрасываю - если он не существует, я хочу сохранить его как пустое.

tableoftimes = race.find('table', class_='raceTimes')
                for row in tableoftimes.find_all('tr'):
                    string23 = [td.get_text() for td in row.find_all('td')]
                    matching = [s for s in string23 if "Track Rating: " in s]
                    if matching:
                        trackrating = matching (#want to split to get after : but wont work in list)
                    else:
                        trackrating = ''


Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Если у вас есть BS4 4.7.1 или выше, вы можете попробовать следующий код.

Попробуйте использовать селектор css, он идентифицирует все сильные теги conatins : в td тег, а затем получить родительский тег td и затем использовать contents[-1], чтобы получить значение

код :

html='''<td><strong>Track Rating:</strong> GOOD</td>
<td></td>
<td><strong>Gross Time:</strong> 1:56:5</td>
<td><strong>Mile Rate:</strong> 1:56:5</td>'''

soup=BeautifulSoup(html,'html.parser')

for item in soup.select('td>strong:contains(":")'):
    print(item.parent.contents[-1].strip())

Выход :

GOOD
1:56:5
1:56:5

В качестве альтернативы Вы также можете использовать next_element после нахождения сильного тега. Первый next_element является сильным тегом, а второй next_element печатает значение после сильного тега

html='''<td><strong>Track Rating:</strong> GOOD</td>
<td></td>
<td><strong>Gross Time:</strong> 1:56:5</td>
<td><strong>Mile Rate:</strong> 1:56:5</td>'''

soup=BeautifulSoup(html,'html.parser')

for item in soup.select('td>strong:contains(":")'):
    print(item.next_element.next_element.strip())

Выход :

GOOD
1:56:5
1:56:5
0 голосов
/ 21 апреля 2020

Попробуйте использовать.

from bs4 import BeautifulSoup

html = """<td><strong>Track Rating:</strong> GOOD</td>
<td></td>
<td><strong>Gross Time:</strong> 1:56:5</td>
<td><strong>Mile Rate:</strong> 1:56:5</td>"""

soup = BeautifulSoup(html, 'html.parser')
for td in soup.find_all('td'):
    if td.find('strong'):         #Check for `strong` tag 
        if td.strong.text == 'Track Rating:':
            print(td.find(text=True, recursive=False))   #Get direct text

Вывод:

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