Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的请求返回一个空列表?;_Python_Web Crawler - Fatal编程技术网

Python 为什么我的请求返回一个空列表?;

Python 为什么我的请求返回一个空列表?;,python,web-crawler,Python,Web Crawler,当我使用XPath抓取和解析腾讯公益的内容时,所有返回的列表都是空的。 下面是我的代码(标题信息是隐藏的)。目标url是。如果有人能帮我解决这个问题,我将不胜感激 import requests import os from lxml import etree if __name__ =='__main__': url = 'https://gongyi.qq.com/succor/project_list.htm#s_tid=75' headers = {

当我使用XPath抓取和解析腾讯公益的内容时,所有返回的列表都是空的。 下面是我的代码(标题信息是隐藏的)。目标url是。如果有人能帮我解决这个问题,我将不胜感激

import requests
import os
from lxml import etree

if __name__ =='__main__':

    url = 'https://gongyi.qq.com/succor/project_list.htm#s_tid=75'
    headers = {
        'User-Agent': XXX    }
    response = requests.get(url=url,headers=headers)
    page_text = response.text
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//div[@class="pro_main"]//li')
    for li in li_list:
        title = li.xpath('./div[2]/div/a/text()')[0]
        print(title)

因此,这里实际发生的情况是,您只能访问
pro_main
div中的第一个
ul
,因为所有这些
li
项及其父项都由JavaScript填充,因此当您使用
请求刮取html时,您的列表将不在那里。get()
,它将是空的

好消息是,问题中的JS脚本使用API填充数据,以及网站的具体操作方式,您还可以使用实际的API检索这些标题并打印它们

import requests, json
import os

if __name__ =='__main__':

    url = 'https://ssl.gongyi.qq.com/cgi-bin/WXSearchCGI?ptype=stat&s_status=1&s_tid=75'
    resp = requests.get(url).text
    resp = resp[1:-1] #Result is wrapped in (), so we get rid of those
    jj = json.loads(resp)
    
    for i in jj["plist"]:
        title = i["title"]
        print(title)
您可以通过打印
jj
来浏览API,以查看是否有以后可能需要的更多信息


让我知道它是否适合你

非常感谢您的帮助!您帮助我解决了这个问题。此外,如果您方便的话,请告诉我resp[1,-1]的含义。我很高兴能提供帮助!当然,我在这个部分旁边做了一些评论,但基本上我们在那里做的是字符串切片。我们从API得到的响应相当异常,因为它不是一个正常的JSON字符串。它被包装在一对“()”中,因此我们需要去掉它们,以便稍后调用json.loads()。resp[1,-1]的意思是“给出从第二个字符到最后一个字符(不包括)的resp”。几周前我接受了你的回答。但我仍然有一些疑问。你在哪里找到返回的JSON数据?如果你看看页面js的请求(在firefox中,它是Web开发者工具的网络选项卡),您将看到,在某个时刻,向该enpoint发出了一个
GET
请求:
https://ssl.gongyi.qq.com/cgi-bin/WXSearchCGI?ptype=stat&s_status=1,1&jsoncallback=\u CallbackSearch&s\u tid=75。I&s\u puin=&s\u fid=&s\u key=&p=&u=1617008778770
,我们已经知道,您要刮取的数据是异步获取的,因为您一开始无法获取数据,我们发现的这个数据看起来就像页面下载数据时使用的API。事实证明,如果我们尝试对其执行get请求,它将返回您想要的结果。请求是通过Python
request
模块通过
request.get()
方法执行的,就像我们执行get请求一样。这将返回一个响应对象,我们希望访问它的文本内容(因此我们使用
text
属性)。