实验要求:
编写Python程序,完成如下任务:
- 抓取北邮官网中的党口单位名称列表(即党委办公室那一部分)并打印出来。
- 需要用bs4的find和select两种方法进行实现。
设计思路及实现:
1.使用requests获取北京邮电大学院系机构htm并保存在本地:
res = requests.get('https://www.bupt.edu.cn/yxjg1.htm')
res.raise_for_status()#检查HTTP请求是否成功
page_file=open('/Users/guyue/code/GitRepositories/Python_programming/Text_lookpu/bupt_list.html', 'wb')
for chunk in res.iter_content(100000):#逐块迭代响应对象 每块大小位100000字节
page_file .write(chunk)
page_file.close()
2.阅读html代码,找到与党口单位相关的片段,其位置在class=="linkPagelist"的ul标签下面的第1个li下面的div下面的ul中:
<ul class="linkPageList">
<li>
<div>
<ul>
<li><a href="https://xwb.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43527)" target="_blank">党委办公室</a></li>
<li><a href="https://dwgk.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43528)" target="_blank">组织部、党校</a></li>
<li><a href="http://news.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43529)" target="_blank">宣传部、新闻中心</a></li>
<li><a href="http://tzb.bupt.edu.cn" onclick="_addDynClicks("wburl", 1552820829, 43530)" target="_blank">统战部</a></li>
<li><a href="http://xunchaban.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 58911)" target="_blank">巡察工作办公室</a></li>
<li><a href="https://jwb.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43531)" target="_blank">纪委办公室</a></li>
<li><a href="#" onclick="_addDynClicks("wburl", 1552820829, 58912)" target="_blank">纪委监督检查室</a></li>
<li><a href="https://jsgzb.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43532)" target="_blank">教师工作部</a></li>
<li><a href="http://xsc.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43533)" target="_blank">学生工作部、武装部</a></li>
<li><a href="http://ygb.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43534)" target="_blank">研究生工作部</a></li>
<li><a href="http://bmc.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 43535)" target="_blank">保密办公室</a></li>
<li><a href="#" onclick="_addDynClicks("wburl", 1552820829, 43536)" target="_blank">保卫部</a></li>
<li><a href="https://jgdw.bupt.edu.cn/" onclick="_addDynClicks("wburl", 1552820829, 58945)" target="_blank">机关党委</a></li>
</ul>
3.使用select方法选择查找并打印文本内容:
for ele in bupt_soup.select('ul.linkPageList > li:nth-of-type(1) > div > ul > li > a'):
print(ele.getText())
4.使用find方法链式查找并打印文本内容:
first_li = bupt_soup.find('ul', class_='linkPageList').find('li')
if first_li:
div_element = first_li.find('div')
if div_element:
ul_element = div_element.find('ul')
if ul_element:
a_elements = ul_element.find_all('a')
for a_element in a_elements:
print(a_element.text.strip())
程序测试:
输出结果如下,经检验完全正确:
党委办公室
组织部、党校
宣传部、新闻中心
统战部
巡察工作办公室
纪委办公室
纪委监督检查室
教师工作部
学生工作部、武装部
研究生工作部
保密办公室
保卫部
机关党委
总结分析:
select方法与find方法都是很好的查找html文本中需要的内容的方法,重点在于理清html文本各元素之间的关系。其中读取文字内容时,发现.text与.getText之间略有不同:
.text
属性:- 使用
.text
属性可以获取元素的文本内容,这是一个属性而不是方法。 - 如果元素内包含子元素,
.text
将获取所有子元素文本内容的合并结果。 - 例如:
element.text
- 使用
.getText()
方法:- 使用
.getText()
方法同样可以获取元素的文本内容,这是一个方法。 - 与
.text
不同,.getText()
方法可以接受参数,用于指定连接文本的字符串。 - 例如:
element.getText(separator=' ')
- 使用
评论(0)