Py学习  »  Python

Python:如何通过BeatifullSoup在表行中通过字符串获取表行?

Niwla23 • 6 年前 • 2467 次点击  
<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,所以这只会过滤掉它自己的类

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51959
文章 [ 3 ]  |  最新文章 6 年前
MrJuicyBacon
Reply   •   1 楼
MrJuicyBacon    7 年前

你可以找到所有包含 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'))
KunduK
Reply   •   2 楼
KunduK    7 年前

请尝试以下代码。获取行文本并检查其是否 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)
QHarr
Reply   •   3 楼
QHarr    7 年前

您可以使用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类型的适当列索引来针对适当的行(我在这里使用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)