<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。所以这只是过滤掉类本身
最佳答案
您可以使用 pandas read_html 抓取表格,然后在类列上进行过滤
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 的适当列索引来定位适当的行(我在这里使用 pandas 只是为了快速生成一个漂亮的表格输出以供查看....你已经有了 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)
关于Python:如何通过 BeautifulSoup 通过其中的字符串获取表格行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58596443/