社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Niwla23 • 6 年前 • 2451 次点击  
<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)