Как найти диапазон со строкой класса по конкретной подстроке в классе python - PullRequest
1 голос
/ 11 ноября 2019

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

<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>

<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>

<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>

Мне нужно получить {time, title, month} в один df. Это нужно выбрать по подстроке "calendar-date" в классе attr.

Я хочу использовать

bs4.find_all('span',{class: XXX})

Но для этого требуется, чтобы класс имел точные атрибуты.

Я не знаю, как написать код.

Ответы [ 3 ]

1 голос
/ 11 ноября 2019

Попробуйте css-селектор без регулярных выражений.

from bs4 import BeautifulSoup

datahtml = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>

<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>

<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""

soup = BeautifulSoup(datahtml, "html.parser")
for span in soup.select("[class^='calendar-date-']"):
    print(span.text)
    print(span.find_previous('td').find_next('div')['title'])
    print(span.find_next('span').text)
0 голосов
/ 11 ноября 2019

Вы можете использовать Regex.

Пример:

import re
from bs4 import BeautifulSoup

html = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>

<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>

<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""

soup = BeautifulSoup(html, "html.parser")
for span in soup.find_all("span", class_=re.compile(r"^calendar\-date\-\d+")):
    print(span.text)
    print(span.find_previous('td').find_next('div')['title'])
    print(span.find_next('span').text)

Выход:

11:50 PM 
ABC
SEP
12:00 PM 
CDE
OCT
12:10 PM 
FGH
NOV
0 голосов
/ 11 ноября 2019

Вы можете получить все span теги и затем отфильтровать их:

spans = [s for s in bs4.find_all('span') if s.get('class', [''])[0].startswith('calendar-date')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...