Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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 BeautifulSoup:刮蒸汽愿望列表游戏-.findAll不返回在inspector中可见的嵌套div_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

Python BeautifulSoup:刮蒸汽愿望列表游戏-.findAll不返回在inspector中可见的嵌套div

Python BeautifulSoup:刮蒸汽愿望列表游戏-.findAll不返回在inspector中可见的嵌套div,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,所以我试图用beautifulsoup从我的steam愿望列表中删除游戏。理想情况下,我想知道游戏的名称,游戏蒸汽商店页面的链接以及当前的标价。问题是,当我调用soup.find_alldiv,{class:wishlist_row}时,它返回一个空列表,尽管我能够在inspector中看到每个游戏的愿望列表上都应该有几个这样的div。以下是我当前代码的浓缩版本: from bs4 import BeautifulSoup import requests profile_id = "id/Zo

所以我试图用beautifulsoup从我的steam愿望列表中删除游戏。理想情况下,我想知道游戏的名称,游戏蒸汽商店页面的链接以及当前的标价。问题是,当我调用soup.find_alldiv,{class:wishlist_row}时,它返回一个空列表,尽管我能够在inspector中看到每个游戏的愿望列表上都应该有几个这样的div。以下是我当前代码的浓缩版本:

from bs4 import BeautifulSoup
import requests

profile_id = "id/Zorro4"

url_base = "https://store.steampowered.com/wishlist/"

r = requests.get(url_base + profile_id + "#sort=order", headers=header)

data = r.text

soup = BeautifulSoup(data, features="lxml")

# find divs containing information about game and steam price
divs = soup.findAll("div", {"class": "wishlist_row"})

print(divs)
>>> []
如果我去的话,我可以清楚地看到检查员身上的这些div 我试过了

使用html.parser代替lxml 欺骗用户代理/头 尝试改用.finddiv,{class:wishlist_row} 除其他外,通过这些线索 我注意到一些奇怪的事情可能有助于解决这个问题,但我不知道该怎么办

soup.find(id="wishlist_ctn") # The div which should contain all the wishlist_row divs
>>> <div id="wishlist_ctn">\n</div> 

据我所知,这个应该会回来。。。因为div包含的嵌套div比我要查找的多。我不知道为什么它只返回换行符。这几乎就好像是在抓取愿望列表的内容时丢失了一样。非常感谢您的帮助,过去几天我一直在努力解决这个问题,但没有成功。

您在网页上看到的数据是通过Javascript/JSON动态加载的。 加载数据的URL位于HTML页面内——我们可以使用re模块来提取它

此示例打印愿望列表的JSON数据:

import re
import json
import requests

url = 'https://store.steampowered.com/wishlist/id/zorro4/#sort=order'
wishlist_url =  json.loads( re.findall(r'g_strWishlistBaseURL = (".*?");', requests.get(url).text)[0] )

data = requests.get(wishlist_url + 'wishlistdata/?p=0').json()
print(json.dumps(data, indent=4))
印刷品:

{
    "50": {
        "name": "Half-Life: Opposing Force",
        "capsule": "https://steamcdn-a.akamaihd.net/steam/apps/50/header_292x136.jpg?t=1571756577",
        "review_score": 8,
        "review_desc": "Very Positive",
        "reviews_total": "5,383",
        "reviews_percent": 95,
        "release_date": "941443200",
        "release_string": "1 Nov, 1999",
        "platform_icons": "<span class=\"platform_img win\"></span><span class=\"platform_img mac\"></span><span class=\"platform_img linux\"></span>",
        "subs": [
            {
                "id": 32,

...and so on.

问题是愿望列表实际上是由一个AJAX请求填充的。Beauty Soup无法处理该功能。你需要一个网络驱动程序。幸运的是,这里的捷径是只使用为wishlist进行的API调用并解析JSON响应。在这种情况下,该请求是:


https://store.steampowered.com/wishlist/profiles/76561198068616380/wishlistdata/?p=0

只要您收到游戏,就应该增加p并循环。虽然您的代码可能适用于此特定的steamid,但不会适用于其他人,因为来自第0页的响应将只包含前100个游戏。谢谢!无论如何,要使用json库导航输出,还是必须使用。手动拆分并解析所有内容?@Jurij否,数据变量的类型为dict,因此您可以像使用普通python字典一样使用它。非常感谢!请详细说明您是如何获得该链接的/对于通过JSON动态加载数据的情况,获得该链接的一般过程是什么?浏览器上的deverOper工具将显示来自加载页面的所有请求。然后可以按类型筛选:图像、css、js等。我在这里假设,但数字串可能是用户id或类似的东西;您将为每个用户更改该值。