<tr class="list even">
<td class="list">5</td>
<td class="list"><s>BI</s>→MU</td>
<td class="list"><s>TEACHER</s>→TEACHER</td>
<td class="list">Hello I am a Text</td>
<td class="list">5b</td>
<td class="list">BI3</td></tr>
Это одна из строк таблицы. Есть некоторые с одной строкой в качестве встроенного заголовка, но idc для них.
Итак, я хочу получить только те строки, которые содержат строку «8f», но не только td
, целые tr
Если есть несколько строк, содержащих строку, она должна дать мне список из них
for row in soup.find_all('tr', class_='list even'):
if '5b' in row.text:
print(row)
for cell in row.find_all('td'):
if "5b" not in cell.text:
print(cell.text)
for row in soup.find_all('tr', class_='list odd'):
if '5b' in row.text:
for cell in row.find_all('td'):
if "5b" not in cell.text:
print(cell.text)
У меня есть это сейчас, но он добавляет новую строку перед последним полем таблицы: https://haste.thevillage.chat/foguvakixa.py
if "5b" not in cell.text:
Это потому, что если я запрашиваю данные для 5d, мне не нужно знать, что это 5d. Так что это просто фильтрует сам класс
3 ответа
Вы можете использовать pandas read_html, чтобы захватить таблицу, а затем отфильтровать по столбцу klasse.
import pandas as pd
def get_lectures_two(df, klasse):
new_df = df[df['(Klasse(n))'] == klasse]
return new_df
def get_df(url):
df = pd.read_html(url)[0]
df = df[~df['Stunde'].str.contains("LEHRER")]
return df
df = get_df('https://niwla23.gitlab.io/download/vertreterdemo.html')
print(get_lectures_two(df, '5b'))
С bs4 4.7.1 + вы можете использовать: contains и: has вместе с соответствующим индексом столбца через nth-of-type для нацеливания на соответствующие строки (здесь я использую панд просто для быстрого создания красивого табличного вывода для просмотра ... у вас уже есть списки списков с bs4 и вы можете использовать csv для записи, например)
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
def get_lectures(klasse):
rows = []
for row in soup.select(f'.mon_list tr:has(td:nth-of-type(5):contains("{klasse}"))'):
rows.append([td.text.replace('\xa0','') for td in row.select('td')])
return rows
r = requests.get('https://niwla23.gitlab.io/download/vertreterdemo.html')
soup = bs(r.content, 'lxml')
headers = [th.text for th in soup.select('th.list')]
klasse = '5b'
df = pd.DataFrame(get_lectures(klasse), columns = headers)
print(df)
Попробуйте следующий code.fetch текст строки и проверьте, имеет ли он 5b
from bs4 import BeautifulSoup
import requests
res=requests.get("http://niwla23.gitlab.io/download/vertreterdemo.html")
soup=BeautifulSoup(res.text,'lxml')
for row in soup.find_all('tr', class_='list even'):
if '5b' in row.text:
print(row.text)
5b
и я его создаю. Если нет, обновите вопрос.
Вы можете найти все tds, которые содержат 5b
, используя только BS вроде этого:
tds_5b = soup.find_all('td', class_='list', text='5b')
А затем выполните итерацию по ним, чтобы найти родительский элемент tr
для каждого из них:
out = set()
for row in tds_5b :
out.add(row.find_parent('tr'))
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.