为了账号安全,请及时绑定邮箱和手机立即绑定

使用 BeautifulSoup 解析单个类中的不同元素

使用 BeautifulSoup 解析单个类中的不同元素

RISEBY 2022-07-05 17:09:34
背景:我对 Python 相当有经验,但对 BeautifulSoup 完全是个菜鸟我试图从一个类中获取 3 个值。我正在使用的页面看起来有一系列元素,如下所示:<blockquote><a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.<a name="title2".... etc</blockquote>目前,我只是将所有文本转储到这样的列表中:page_html = soup(page, 'html.parser')text = []for a in page_html.select('a'):    text.append(a.text)这将返回每行如下所示的结果:Title Subtitle: Top Text. Body Text.我真正想要的是能够将每个解析a成数据框中的一行,看起来像:col1      col2                    col3Title     Subtitle: Top Text.     Body Text.但坦率地说,我有点过头了。
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

如果您的所有<a>标签都相同,则可以使用:


from bs4 import BeautifulSoup


import pandas as pd



page = '''<blockquote>

<a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.</blockquote>

'''

soup = BeautifulSoup(page, "html.parser")




text = []



for texts in soup.find_all('a'):

    paragraph = texts.find('p')


    title = texts.find('b').text

    subtitle = texts.find_all('b')[1].text

    other = ''.join(paragraph.find_all(text=True, recursive=False))


    d = {'col1': [title], 'col2': [subtitle],'col3' : [other]}

    df = pd.DataFrame(data=d)



print(df)

输出 :


   col1                 col2          col3

0  Title  Subtitle: Top Text.    Body Text.


查看完整回答
反对 回复 2022-07-05
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

仅使用您共享的 HTML 片段:


from bs4 import BeautifulSoup


content = '<a name="title"><p><B>Title</b> ' \

          '<table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue">' \

          '<tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font>' \

          '</td></tr></table> Body Text.'


soup = BeautifulSoup(content, 'html.parser')

articles = soup.find_all('a')


for article in articles:

    paragraph = article.find('p')

    print({

        'title': article.find('b').text,

        'subtitle': article.select('table i')[0].text,

        'body': ''.join(paragraph.find_all(text=True, recursive=False))

    })

由于问题主要是关于 BeautifulSoup,而不是关于 Pandas,我认为字典就足够了,你可以自己将它放入数据框或其他数据结构中吗?


结果:


{'title': 'Title', 'subtitle': 'Subtitle', 'body': '  Body Text.'}


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信