【发布时间】:2021-10-22 02:36:15
【问题描述】:
我写了一个从网络漫画中提取链接图片的程序,但是,当我运行它时,它只是从最后一个链接章节中提取图像链接,而不是从所有章节中提取所有图像链接。我的程序有什么问题? 我尝试了几种方法,但都没有用。
from PyQt5 import QtNetwork, QtCore
from requests_html import HTML
from functools import cached_property
from PyQt5.QtCore import QCoreApplication, QUrl
url1 = "https://saytruyen.net/truyen-su-tro-lai-cua-phap-su-hac-am-sau-66666-nam.html"
class Manager:
def __init__(self):
self.manager.finished.connect(self.handle_response)
@cached_property
def manager(self):
return QtNetwork.QNetworkAccessManager()
def start(self):
self.start_request(QtCore.QUrl(url1))
def start_request(self, url):
request = QtNetwork.QNetworkRequest(url)
self.manager.get(request)
def handle_response(self, reply):
err = reply.error()
if err == QtNetwork.QNetworkReply.NoError:
self.process(str(reply.readAll(), 'utf-8'))
else:
print("Error occured: ", err)
print(reply.errorString())
def process(self, data):
html = HTML(html=data)
rs = html.find("#list-chapter a", first=False)
for i in reversed(rs):
url2 = "https://saytruyen.net/" + i.attrs["href"]
#print(url2)
#self.start_request(QtCore.QUrl(url2))
req = QtNetwork.QNetworkRequest(QUrl(url2))
self.nam = QtNetwork.QNetworkAccessManager()
self.nam.finished.connect(self.handleResponse)
self.nam.get(req)
def handleResponse(self, reply):
er = reply.error()
if er == QtNetwork.QNetworkReply.NoError:
bytes_string = reply.readAll()
html2 = HTML(html = str(bytes_string, 'utf-8'))
rs_c = html2.find("#lst_content img")
for x in rs_c:
img ="https://saytruyen.net/" + x.attrs['src']
print(img)
else:
print("Error occured: ", er)
print(reply.errorString())
QCoreApplication.quit()
【问题讨论】:
-
尝试在
__init__中移动self.nam的前两行。 -
这种方式无效
-
它应该:问题是你在 for 循环中不断地重新创建一个新的 QNetworkAccessManager,所以结果是前一个被垃圾收集(删除)并且只有最后一个创建的能够“生存”并处理请求。应该只存在一个新 url 的管理器,并且只有
self.nam.get(req)应该存在于 for 循环中。另外,你不应该在handleResponse的末尾明显退出,否则其他请求将永远不会被处理。 -
哦,谢谢它的工作