鱼C论坛

 找回密码
 立即注册
查看: 2423|回复: 4

[已解决]爬虫问题求助

[复制链接]
发表于 2022-4-15 16:08:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[0].split('>')[1].split("<")[0]       #split 分割两次得出要的内容
            zz = re.findall(r'作者:.*?\(',each.get('tip'))     #用正则在  tip 里面 查找 作者
            zz_name = zz[0].split(':')[1].split('(')[0]      # #split 分割两次得出要的内容
            itl.append([ls_name,zz_name,each.get("href")])   #放进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[0] , each[1] ,each[2]))   #显示内容
    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>【原创首发】“大蓝鲫&#8226;腥世界”——转战大潮</strong><br/>作者: 子鱼365 (<span title='2022-4-13'>前天&nbsp;16:38</span>)<br/>查看/回复: 66/15" onmouseover="showTip(this)" target="_blank">【原创首发】“大蓝鲫&#8226;腥世界” ...</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)  显示出来不整齐,请问有没有好办法让显示内容的整齐一点。

谢谢!
最佳答案
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(':')[1].split('(')[0]
            itl.append([ls_name,zz_name,each.get("href")])   #放进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([i] + j)
        print(table)
    except :
        print("Funation main 程序出错!")

if __name__ =="__main__" :
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-15 17:23:14 | 显示全部楼层
可以用xpath吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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(':')[1].split('(')[0]
            itl.append([ls_name,zz_name,each.get("href")])   #放进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([i] + j)
        print(table)
    except :
        print("Funation main 程序出错!")

if __name__ =="__main__" :
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-16 09:19:59 | 显示全部楼层

还不会 xpth
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-18 15:24:16 | 显示全部楼层
isdkz 发表于 2022-4-15 18:10
第一个问题:

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

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 19:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表