P

Python程序设计—文本查找

古月 2023-11-03

实验要求:

编写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(&#34;wburl&#34;, 1552820829, 43527)" target="_blank">党委办公室</a></li>
<li><a href="https://dwgk.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43528)" target="_blank">组织部、党校</a></li>
<li><a href="http://news.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43529)" target="_blank">宣传部、新闻中心</a></li>
<li><a href="http://tzb.bupt.edu.cn" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43530)" target="_blank">统战部</a></li>
<li><a href="http://xunchaban.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 58911)" target="_blank">巡察工作办公室</a></li>
<li><a href="https://jwb.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43531)" target="_blank">纪委办公室</a></li>
<li><a href="#" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 58912)" target="_blank">纪委监督检查室</a></li>
<li><a href="https://jsgzb.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43532)" target="_blank">教师工作部</a></li>
<li><a href="http://xsc.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43533)" target="_blank">学生工作部、武装部</a></li>
<li><a href="http://ygb.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43534)" target="_blank">研究生工作部</a></li>
<li><a href="http://bmc.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43535)" target="_blank">保密办公室</a></li>
<li><a href="#" onclick="_addDynClicks(&#34;wburl&#34;, 1552820829, 43536)" target="_blank">保卫部</a></li>
<li><a href="https://jgdw.bupt.edu.cn/" onclick="_addDynClicks(&#34;wburl&#34;, 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之间略有不同:

  1. .text 属性:

    • 使用 .text 属性可以获取元素的文本内容,这是一个属性而不是方法。
    • 如果元素内包含子元素,.text 将获取所有子元素文本内容的合并结果。
    • 例如:element.text
  2. .getText() 方法:

    • 使用 .getText() 方法同样可以获取元素的文本内容,这是一个方法。
    • .text 不同,.getText() 方法可以接受参数,用于指定连接文本的字符串。
    • 例如:element.getText(separator=' ')

评论(0)

发布评论