潺陵大地 发表于 2022-4-15 16:08:39

爬虫问题求助

import requests
from bs4 import BeautifulSoup
import re

def gethttpText(url) :   #获取网页数据
    try :
      r = requests.get(url ,timeout = 30)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      return r.text
    except :
      print("Funation getHttpText 代码出错!")

def parserPage(itl,html):   #解析网页数据
    try :
      soup = BeautifulSoup(html,"html.parser")
      find_shuju = soup.find('div', attrs={'class': "subjectbox"})#查找标签div 内容为class="tit_replay"这是 最新的回复
      find_a = find_shuju.find_all('a')      #进一步查找到 标签a 内容
      for each in find_a :                   #迭代标签 a的取内容
            ls = re.findall(r'<strong>.*?</strong>',each.get('tip'))    #用正则 在 tip里面 查找符合要求的内容 就是 文章题目
            ls_name = ls.split('>').split("<")       #split 分割两次得出要的内容
            zz = re.findall(r'作者:.*?\(',each.get('tip'))   #用正则在tip 里面 查找 作者
            zz_name = zz.split(':').split('(')      # #split 分割两次得出要的内容
            itl.append()   #放进itl 参数列表中
    except:
      print("Funation parserPage 程序出错!")

def printList(itl) :   #显示屏幕上
    list_top = "{:4}\t{:32}\t{:20}\t{:32}"    #格式化头
    print(list_top.format("序号","题目","作者","链接"))   #显示列表头
    count = 0
    try :
      for each in itl :
            count += 1
            print(list_top.format(count , each , each ,each))   #显示内容
    except:
      print("Funation printList 程序出错!")
def main():
    try:
      url = 'http://bbs.lwhfishing.com/forum.php'
      html = gethttpText(url)
      itl = []
      parserPage(itl,html)
      printList(itl)
    except :
      print("Funation main 程序出错!")

if __name__ =="__main__" :
    main()


要爬的内容大致如下 :

<td valign="top" class="category_l2">
<div class="subjectbox">
<h4><span class="tit_subject"></span>最新主题</h4>
      <ul class="category_newlist">
                        <li><a href="forum.php?mod=viewthread&amp;tid=1149&amp;extra=" tip="标题: <strong>[原创] 浮钓拉巧嘴</strong><br/>作者: 野钓迷 (<span title='2022-4-15'>4&nbsp;小时前</span>)<br/>查看/回复: 8/4" onmouseover="showTip(this)" target="_blank">[原创] 浮钓拉巧嘴</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1147&amp;extra=" tip="标题: <strong>【原创首发】“大蓝鲫•腥世界”——转战大潮</strong><br/>作者: 子鱼365 (<span title='2022-4-13'>前天&nbsp;16:38</span>)<br/>查看/回复: 66/15" onmouseover="showTip(this)" target="_blank">【原创首发】“大蓝鲫•腥世界” ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1146&amp;extra=" tip="标题: <strong>[原创] 三移其窝终有获</strong><br/>作者: 野钓迷 (<span title='2022-4-13'>前天&nbsp;05:47</span>)<br/>查看/回复: 114/28" onmouseover="showTip(this)" target="_blank">[原创] 三移其窝终有获</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1145&amp;extra=" tip="标题: <strong>【原创首发】大蓝鲫美极鲜收获满满</strong><br/>作者: 坚守誓言 (<span title='2022-4-12'>3&nbsp;天前</span>)<br/>查看/回复: 144/25" onmouseover="showTip(this)" target="_blank">【原创首发】大蓝鲫美极鲜收获满 ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1144&amp;extra=" tip="标题: <strong>[原创] 洸河南钓小鱼</strong><br/>作者: 野钓迷 (<span title='2022-4-12'>3&nbsp;天前</span>)<br/>查看/回复: 229/33" onmouseover="showTip(this)" target="_blank">[原创] 洸河南钓小鱼</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1143&amp;extra=" tip="标题: <strong>【原创首发】废塘钓到狠东西</strong><br/>作者: 潺陵大地 (<span title='2022-4-11'>4&nbsp;天前</span>)<br/>查看/回复: 134/19" onmouseover="showTip(this)" target="_blank">【原创首发】废塘钓到狠东西 ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1142&amp;extra=" tip="标题: <strong>【原创首发】钓鱼日记:4.6大风无鱼挖菜</strong><br/>作者: 念念不忘 (<span title='2022-4-11'>4&nbsp;天前</span>)<br/>查看/回复: 117/18" onmouseover="showTip(this)" target="_blank">【原创首发】钓鱼日记:4.6大风 ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1141&amp;extra=" tip="标题: <strong>【原创首发】书法习作,请雅正</strong><br/>作者: 江海道人 (<span title='2022-4-11'>4&nbsp;天前</span>)<br/>查看/回复: 135/16" onmouseover="showTip(this)" target="_blank">【原创首发】书法习作,请雅正 ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1140&amp;extra=" tip="标题: <strong>【原创首发】小坐钓小河</strong><br/>作者: 野钓手 (<span title='2022-4-11'>4&nbsp;天前</span>)<br/>查看/回复: 157/18" onmouseover="showTip(this)" target="_blank">【原创首发】小坐钓小河 ...</a></li>
              <li><a href="forum.php?mod=viewthread&amp;tid=1139&amp;extra=" tip="标题: <strong>【原创首发】让我一次钓个够......</strong><br/>作者: 野钓手 (<span title='2022-4-11'>4&nbsp;天前</span>)<br/>查看/回复: 142/15" onmouseover="showTip(this)" target="_blank">【原创首发】让我一次钓个够.... ...</a></li>
         </ul>
         </div>
</td>

二个问题:
一、我的取出 <strong></strong>之间的题目内容和“作者:” 这个内容代码比较麻烦 ,肯定 有更简便 的办法,但我只能一层一层找到了 再正则取出。因为这个页面下面还有 更多的 <strong></strong>的内容,所以不能直接从整体页面用正则取出,想了好久我也只能这一层一层找,能否有更简便的办法?
二、函数 printList(itl)显示出来不整齐,请问有没有好办法让显示内容的整齐一点。

谢谢!

代码小白liu 发表于 2022-4-15 17:23:14

可以用xpath吧

isdkz 发表于 2022-4-15 18:10:32

本帖最后由 isdkz 于 2022-4-16 08:23 编辑

第一个问题:

你可以继续对 tip 标签的内容使用 BeautifulSoup 解析

第二个问题:

想打印的更整齐一点可以使用 prettytable 这个库,使用之前先执行以下命令安装。
pip install prettytable -i https://mirrors.aliyun.com/pypi/simple

对你的代码修改如下:
import requests
from bs4 import BeautifulSoup
from prettytable import PrettyTable

def gethttpText(url) :   #获取网页数据
    try :
      r = requests.get(url ,timeout = 30)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      return r.text
    except :
      print("Funation getHttpText 代码出错!")

def parserPage(itl,html):   #解析网页数据
    try :
      soup = BeautifulSoup(html,"html.parser")
      find_shuju = soup.find('div', attrs={'class': "subjectbox"})#查找标签div 内容为class="tit_replay"这是 最新的回复
      find_a = find_shuju.find_all('a')      #进一步查找到 标签a 内容
      for each in find_a :                   #迭代标签 a的取内容
            tip_soup = BeautifulSoup(each['tip'],"html.parser")
            ls_name = tip_soup.find('strong').text
            zz_name = tip_soup.find('br').next_element.split(':').split('(')
            itl.append()   #放进itl 参数列表中
    except:
      print("Funation parserPage 程序出错!")


def main():
    try:
      url = 'http://bbs.lwhfishing.com/forum.php'
      html = gethttpText(url)
      itl = []
      parserPage(itl,html)
      table = PrettyTable(field_names=("序号","题目","作者","链接"))
      for i,j in enumerate(itl):
            table.add_row( + j)
      print(table)
    except :
      print("Funation main 程序出错!")

if __name__ =="__main__" :
    main()

潺陵大地 发表于 2022-4-16 09:19:59

代码小白liu 发表于 2022-4-15 17:23
可以用xpath吧

还不会 xpth{:5_109:}

潺陵大地 发表于 2022-4-18 15:24:16

isdkz 发表于 2022-4-15 18:10
第一个问题:

你可以继续对 tip 标签的内容使用 BeautifulSoup 解析


谢谢 {:5_106:}
页: [1]
查看完整版本: 爬虫问题求助