python - 使用 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 对象。
我在用:
- 视窗 10
- 蟒蛇 3.8
解决方案
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))
推荐阅读
- model - tensorflow.js:TypeError:无法读取未定义或空引用的属性“长度”
- vb.net - 测量代码执行所用的时间
- sql - 如何检索最新阅读
- sql - 我进行了完全联接,但我无法获得一次从不匹配的值 - SQL/BigQuery
- sql - SQL减去一列两行
- python - 如何在 x 轴上使用字符串变量绘制 seaborn 线图
- android-studio - 我无法创建任何类型的文件
- django - 触发 on_cascade 时跳过删除方法
- regex - 密码的正则表达式至少 8 个字符、大写、小写、数字、特殊字符和不重复?
- jquery - 使用 jQuery AJAX 验证登录表单