自上周以来我一直在学习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文档以寻求解决方案,但与此同时,如果有人愿意帮助我,那就太好了。
答案 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]