首页 > 解决方案 > 使用 BeautifulSoup 的网络刮板不起作用

问题描述

我为 Stack Overflow 编写了一个网络爬虫,但它不起作用。显然,在我的汤中,有无处可寻的 NoneType 对象。这是网络爬虫代码:

import requests
from bs4 import BeautifulSoup

url = 'https://stackoverflow.com/questions?tab=newest&page='

r = requests.post(url)
soup = BeautifulSoup(r.text, 'lxml').find('div', id='questions').find_all('div')

for summary in soup: # FIXME: Prints each question twice
    try:
        print(f'Question: {summary.h3.text}')
        print(f'Tags: {", ".join(summary.find("div", class_="tags").text[1:].split(" "))}')
    except Exception as e:
        print(e) # Prints "'NoneType' has no attribute 'text'" which shouldn't be in the soup

我得到的错误(如果您没有阅读评论)是“'NoneType' 没有属性'text'”,这让我很困惑,因为汤中有 NoneType 对象。

我在用:

标签: pythonpython-3.xweb-scrapingbeautifulsouppython-requests

解决方案


JP193 已经为您解答了NoneType退货的原因。

我在您的代码中发现的一个大问题是,<div>您发现使用BeautifulSoup(r.text,xml').find('div', id='questions').find_all('div')arent 的每个人都需要获取“问题”和“标签”,这就是您收到大量AttributeError消息的原因。要浓缩<div>相关的内容,您需要仔细查看由于soup. 最好的浓缩结果soup将是找到所有<div>class存在"question-summary"。所以代码应该看起来更像:

soup = BeautifulSoup(r.content, "html.parser").find("div", id="questions").find_all("div", {"class": "question-summary"})

在那之后,如何打印“问题”和“标签”的结果取决于您。我已经这样做了:

    try:
        question = q.find("div", {"class": "summary"}).find('h3')
        print('Question: ' + question.text)

        tags = soup[0].find("div", {"class": "tags"}).text.split()
        print('Tags: ' + ', '.join(tags))
    except AttributeError:
        print('AttributeError div ' + str(int + 1)) 

放在一起我的解决方案是:

from bs4 import BeautifulSoup

url = 'https://stackoverflow.com/questions?tab=newest&page='

r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser").find("div", id="questions").find_all("div", {"class": "question-summary"})

for int, q in enumerate(soup):
    try:
        question = q.find("div", {"class": "summary"}).find('h3')
        print('Question: ' + question.text)

        tags = soup[0].find("div", {"class": "tags"}).text.split()
        print('Tags: ' + ', '.join(tags))
    except AttributeError:
        print('AttributeError div ' + str(int + 1))

推荐阅读