html - 为什么BeautifulSoup find_all 返回的list都不是按照网页显示顺序排序的?

查看:162
本文介绍了html - 为什么BeautifulSoup find_all 返回的list都不是按照网页显示顺序排序的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我想爬糗百的段子,显示作者,和对应的段子,先只爬第一面

import requests
from bs4 import BeautifulSoup as bs
page = 1
url = "http://www.qiushibaike.com/hot/page/"
r = requests.get(url+str(page))
soup = bs(r.content,"html.parser")
names = []
for n in  soup.find_all("a",{"href":True,"target":True,"title":True}):
    names += [n.h2.get_text()]
print(names)

print 结果:

['威信红包接龙关注', 'ZBZBZBZ', '养贼专业户', '柱流年', '大风起兮雪飞扬', '依然家的麦芽糖', '小小&妖精', '苍南下山耍流氓,黑衣格哥买红糖', '九妹妹~', '亲爱de橄榄绿', '有点胖的妮妮', '污奇奇', '没办法就是这么帅', '亦龙', '哇噻~桃宝', '单名一个饭字', 'ni敢拿命疼我吗?', '许我三日暖', '半阙词曲丶', '谁动了我的粮食?']

html.fromstring xpath 也这样

from lxml import html
import requests
page = 1
url = "http://www.qiushibaike.com/hot/page/"
r = requests.get(url+str(page))
tree = html.fromstring(r.content)
print(tree.xpath('//*[@class="article block untagged mb15"]/div[1]/a[2]/h2/text()'))

print 结果:

['威信红包接龙关注', 'ZBZBZBZ', '养贼专业户', '大风起兮雪飞扬', '柱流年', '依然家的麦芽糖', '小小&妖精', '苍南下山耍流氓,黑衣格哥买红糖', '九妹妹~', '亲爱de橄榄绿', '有点胖的妮妮', '污奇奇', '没办法就是这么帅', '亦龙', '单名一个饭字', 'ni敢拿命疼我吗?', '许我三日暖', '半阙词曲丶', '根@儿', '我是你的绝无仅有']

但网页的实际显示顺序是:

['威信红包接龙关注', '养贼专业户', 'ZBZBZBZ', '柱流年', '有点胖的妮妮', '依然家的麦芽糖', '小小&妖精', '大风起兮雪飞扬', '苍南下山耍流氓,黑衣格哥买红糖', '九妹妹~',  '亦龙'...]

如何让返回的list的元素的顺序和网页显示顺序相同?

解决方案

应该是因为它页面的内容的排序是在变动的。他的排序是根据评论里面的个好笑数来排的,好笑 数字接近的,顺序变化正常,而且有时有新的段子加入这页。你浏览器取得页面的时间,和爬虫爬取的时间不一样,看到的段子顺序不一样很正常。

这篇关于html - 为什么BeautifulSoup find_all 返回的list都不是按照网页显示顺序排序的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆