BeautifulSoup findAll选择类时返回空列表

时间:2019-04-23 10:07:25

标签: python html web-scraping beautifulsoup

findall()指定类时返回空列表

指定标签可以正常工作

import urllib2
from bs4 import BeautifulSoup

url = "https://www.reddit.com/r/Showerthoughts/top/?sort=top&t=week"

hdr = { 'User-Agent' : 'tempro' }
req = urllib2.Request(url, headers=hdr)
htmlpage = urllib2.urlopen(req).read()

BeautifulSoupFormat = BeautifulSoup(htmlpage,'lxml')
name_box = BeautifulSoupFormat.findAll("a",{'class':'title'})

for data in name_box:
    print(data.text)

我正在尝试仅获取帖子的文本。当前代码什么都不打印。如果我删除了{'class':'title'},它会打印出我不想要的帖子文字,用户名和帖子的评论。

我正在将python2与最新版本的BeautifulSoup和urllib2一起使用

2 个答案:

答案 0 :(得分:2)

要获取所有注释,您将需要诸如selenium之类的方法来进行滚动。如果没有这些,就可以得到初步的结果,您可以从requests响应中的脚本标签中获取

import requests
from bs4 import BeautifulSoup as bs
import re
import json

headers = {'User-Agent' : 'Mozilla/5.0'}
r = requests.get('https://www.reddit.com/r/Showerthoughts/top/?sort=top&t=week', headers = headers)
soup = bs(r.content, 'lxml')
script = soup.select_one('#data').text
p = re.compile(r'window.___r = (.*); window')
data = json.loads(p.findall(script)[0])
for item in data['posts']['models']:
    print(data['posts']['models'][item]['title'])

答案 1 :(得分:1)

您尝试使用的选择器不好,因为这些帖子没有class =“ title”。请尝试以下操作:

name_box = BeautifulSoupFormat.select('a[data-click-id="body"] > h2')

这会找到所有<a data-click-id="body">标签<h2>,其中包含您需要的帖子文本

有关使用BeatufulSoup的选择器的更多信息,您可以在这里阅读: (https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors