<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
Niwla23 28 Окт 2019 в 21:25
Что ты уже испробовал?
 – 
Michele Bastione
28 Окт 2019 в 21:28
Ничего, я ничего не нашел, как это сделать
 – 
Niwla23
28 Окт 2019 в 21:30

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)
2
QHarr 29 Окт 2019 в 06:29

Попробуйте следующий 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)
1
KunduK 28 Окт 2019 в 22:17
Можете ли вы также поделиться своим URL-адресом и ожидаемым результатом?
 – 
KunduK
28 Окт 2019 в 21:59
На нашем школьном сервере есть копия с черными именами: niwla23.gitlab.io/download/vertreterdemo .html Итак, я хочу, чтобы все строки были между одним заголовком и следующим заголовком. Итак план на одно занятие.
 – 
Niwla23
28 Окт 2019 в 22:03
: что вы ожидаете от этой ссылки?
 – 
KunduK
28 Окт 2019 в 22:08
1
Измените с lxml на htmt.parser
 – 
KunduK
28 Окт 2019 в 22:44
1
: Если бы вы могли обновить свой URL-адрес в исходном сообщении и предоставить чистый вывод, который вам нужен, с веб-страницы с примерами данных, это было бы здорово. Я путаю банкомат с ожидаемым результатом. Я подумал, что вам могут понадобиться данные строк, которые содержат 5b и я его создаю. Если нет, обновите вопрос.
 – 
KunduK
28 Окт 2019 в 23:48

Вы можете найти все 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'))
1
MrJuicyBacon 29 Окт 2019 в 02:30