需要帮助,使用bs4 / python从网页上抓取一段没有div的松散文本

时间:2019-10-22 16:10:58

标签: python-3.x

自上周以来我一直在学习python,我需要在网站上抓取有关城市的信息。我设法抓取了整个网站,但我无法完全删除每个城市网页中所需的特定文本信息(这是其中一个城市信息(http://www.mon-maire.fr/maire-de-abbecourt-02的网址)

这是我正在工作的街区

<div class="constructeur">
<b>Village: </b>Abbécourt <br/>
<b>Population :</b> 536 habitants <br/>
<b>Département :</b> Aisne <br/>
<b>Code postal :</b> 02300 <br/>
</div>

我正在尝试创建一个像这样的列表,里面有松散的文字

list = [Abbécourt,536 habitants,Aisne,02300]

我想出了这段代码

import bs4
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'http://www.mon-maire.fr/maire-de-abbecourt-02' 
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")

sidebar = page_soup.findAll("div", {"class":"constructeur"})
for li in sidebar:
    b = li.findAll('br')
    print(b)

但仅打印[<br/>, <br/>, <br/>, <br/>]

当我查看bs4 doc时,我尝试过

b = li.findAll('br.next_element')
b = li.findAll('br.previous_element')

但是它不起作用。我仍在寻找bs4文档以寻求解决方案,但与此同时,如果有人愿意帮助我,那就太好了。

1 个答案:

答案 0 :(得分:0)

b = [i.next_sibling.strip() for i in page_soup.select('div.constructeur > b')]

使用bs4的CSS选择器(.select)而不是查找父元素,而是找到您真正关心的子元素,而字符串'div.constructeur > b'则用粗体表示带有class Constructeur的div元素中的标记,将返回一个列表。

使用列表理解来遍历b标签列表,将next_sibling抓住b标签将是您想要的数据,并去除文本,因为它有很多空白。


li.findAll('br.next_element')不起作用的原因是,该函数对标记对象进行操作,而该标记对象是.findAll返回的列表中包含的内容。

您想要的是

b = li.findAll('br')
b = [i.previous_element.strip() for i in b]