pandas 如何将总裁的讲话刮到数据框中?

vwoqyblh  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(87)

我想从下面的网站抓取网页:https://www.assemblee-nationale.fr/12/cri/2003-2004/20040001.asp#TopOfPage。
下面是一个HTML示例:

<html>
 <body>
  <div align="center">
   <p align="JUSTIFY">
    <strong></strong>
    <strong> M. le président </strong>
    Conformément...
    <br>
    Mes chers...
    <strong> M. Maxime </strong>
    Nous aussi!
    <br>
    <strong></strong>
   </p>
   <p align="JUSTIFY">
    <strong></strong>
    <strong> M. le président </strong>
    En ouvrant...
    <br>
    Je vous...
    <i>
     (Mmes et MM...)
     <br>
     <strong></strong>
    </i>
   </p>
  </div>
 </body>
</html>

我想把网站转换成一个数据框架,每个演讲者在一个列(强),演讲在另一个列。
下面是我的代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd

debate=[]
df=pd.DataFrame()
url = "https://www.assemblee-nationale.fr/12/cri/2003-2004/20040001.asp"
r=requests.get(url)
soup_data=BeautifulSoup(r.content, 'html.parser')
list_soup_div=soup_data.find_all('div', {'align':'center'})
for item_soup_div in list_soup_div:
    for item_soup_p in item_soup_div.find_all('p', {'align':'JUSTIFY'}):
        for br_tag in item_soup_p.find_all('br'):
            text_speech=br_tag.previous.strip()
            text_speaker=br_tag.find_previous('strong').get_text(strip=True)
            debate.append({'speaker': text_speaker, 'speech': text_speech})
df=pd.DataFrame(debate)

我获得的:

speaker         speech
M. le président Conformément
M. le président Mes chers...
M. Maxime       Nous aussi!
M. le président En ouvrant...
M. le président (Mmmes et MM...)

我想要的:

speaker         speech
M. le président Conformément
M. le président Mes chers...
M. Maxime       Nous aussi!
M. le président En ouvrant...
M. le président Je vous... (Mmmes et MM...)

当我有一个<i>时,在<br〉之前没有,这就是为什么我在示例中得到一个缺失的speach。
我应该如何改进我的代码?

rsaldnfx

rsaldnfx1#

编辑

感谢您的评论,所以让我们尝试其他方式和decompose()都空<strong>

for tag in soup.select('strong'):
    if len(tag.get_text(strip=True)) == 0:
        tag.decompose()

然后迭代每个<strong>next_siblings,如果其中一个是<strong>则中断:

for e in soup.select('p[align="JUSTIFY"]:not(:has(a)) >strong'):
    d = {
        'speaker':e.get_text(strip=True),
        'speech':''
        }
    for s in e.next_siblings:
        if s.name == 'strong':
            break
        else:
            d['speech'] = d['speech']+' '+s.get_text(strip=True)
    data.append(d)

示例

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://www.assemblee-nationale.fr/12/cri/2003-2004/20040001.asp'
soup = BeautifulSoup(requests.get(url).text)
data = []

for tag in soup.select('strong'):
    if len(tag.get_text(strip=True)) == 0:
        tag.decompose()

for e in soup.select('p[align="JUSTIFY"]:not(:has(a)) >strong'):
    d = {
        'speaker':e.get_text(strip=True),
        'speech':''
        }
    for s in e.next_siblings:
        if s.name == 'strong':
            break
        else:
            d['speech'] = d['speech']+' '+s.get_text(strip=True)
    data.append(d)

pd.DataFrame(data)
输出

| | 扬声器|言语|
| - -|- -|- -|
| 第0页|总统先生。|降神会在12点结束。|
| 一个|总统先生。|根据宪法第28条的规定,我决定召开2003- 2004年的普通会议。我的同事们,允许我在你们之前告诉你们,我很快就会回来的。|
| 2个|马克西姆·格雷梅茨先生。|我们也是!|
| 三个|总统先生。|在本次会议上,我想解释我们大家都在面对的这部影片,这是一个家庭的故事。因此,我要求你们默哀一分钟。|
| 四个|总统先生。|根据《条例》第10条,在常会开始时,主席由六名以上年轻议员协助,他们履行秘书的职能。爱德华·库蒂亚尔先生、娜塔丽·科斯丘斯科-莫里泽夫人、文森特·罗兰先生、塞巴斯蒂安·休伊赫、马夏尔·萨迪耶、洛朗·埃纳特。|
| 五个|总统先生。|今天的命令要求提名国民议会六名副总统、三名议长和两名秘书。关于这些不同的职能,各集团的主席列出了一份候选人名单。我不需要任何其他候选人。弗朗索瓦·巴罗安先生、让·勒加雷克先生、马克-菲利普·多布雷斯先生、鲁迪·萨莱斯先生、埃莱娜·米尼翁女士、埃里克·拉乌尔先生;询问者:亨利·库克先生,克劳德·盖拉尔,迪迪埃·米戈;秘书:雅克·布吕纳先生、弗朗索瓦-米歇尔·贡诺先生、让-皮埃尔·库谢达先生、阿兰·穆内-布雷桑先生、热敏尔·佩罗先生、玛丽-弗朗索瓦·佩罗尔-杜蒙女士、贝尔纳·佩鲁先生、让·普罗里奥尔先生、迪迪埃·昆廷先生、弗朗索瓦·罗什布洛因先生、弗雷德里克·德·圣塞尔南先生、让·于贝尔施拉格先生。|
| 六个|总统先生。|我认为国民议会主席团已经组成。主席团的组成已通知共和国总统先生、总理先生和议会主席先生,并在《官方日报》上发表。主席团将于10月8日,即9月9日举行会议。|
| 七个|总统先生。|我注意到,六个常设委员会于今年12月中旬召开会议,选举主席团成员,我还注意到,我将于12月18日再次召开主席会议。|
| 八个|总统先生。|总理先生在2003年9月2日、12日和15日的信中通知我,临时代表团分别由卢瓦尔省代表让-弗朗索瓦·乔西先生、上莱茵省代表吉尔伯特·迈耶先生、洛特-加龙省代表米歇尔·迪芬巴赫先生和伊夫林省代表克莉丝汀·布廷女士组成,2003年9月15日为上述两个会议举行。|

| 九个|总统先生。|我收到总理先生的一封信,通知我关于卡尔瓦多斯代表布里Git·勒布雷东女士根据《选举法》第144条的规定担任临时特派团的决定,这一决定的目的是在2003年7月30日的《官方公报》上发表一项决定。总理写信通知我,根据农业、粮食和农业部长先生根据《选举法》第144条的规定,由临时特派团菲尼特代表克里斯蒂安·梅纳德先生作出的决定,这一决定的目的是在2003年7月31日的《官方公报》上发表一项决定。根据选举法第144条的规定,临时特派团上莱茵省代表弗朗西斯Hillmeyer先生根据装备、运输、后勤部长先生的指示作出决定,这一决定是2003年8月28日正式发表在《官方日报》上的。皮埃尔·朗,摩泽尔代表,临时代表团成员,根据《选举法》第144条的规定,这一决定是2003年9月19日《官方公报》发表的一项决定的目标。Pierre Morel-A-L 'Huissier,代表Lozère,临时代表团成员,根据《选举法》第144条的规定,根据国家前战斗人员事务秘书长的意见,作出这一决定,目的是在2003年9月24日的《正式公报》上正式发表。|
...
认为它接近于您的一个仍在回答的封闭式问题-更具体地选择您的元素,并检查<i>是否可用:

for e in soup.select('p[align="JUSTIFY"]:not(:has(a)) > br'):
    data.append({
        'speaker':e.find_previous('strong').get_text(strip=True),
        'speech':' '.join((e.previous.strip(), e.next.strip(), e.find_next_sibling('i').get_text(strip=True) if e.find_next_siblings('i') else ''))
    })

相关问题