Python和Beautifulsoup 4 - findAll没有获得所有元素,只获得第一个?

问题描述 投票:0回答:2

我正试图从KicksUSA.com刮去鞋码,我似乎无法得到产品页面上显示的鞋码。以此页面为例 - https://www.kicksusa.com/jordan/air-jordan-13-retro-atmosphere-greyblack-white-univ-red-414571-016.html - 我试图在那里显示所有尺寸。

尺寸出现在我注意到的3个地点 -

  1. 作为data-label元素中的a元素的div.input-box.validation-passed属性(或者,如果我们在dd.last元素内的上面的一个元素)
  2. option元素与price0元素中等于select
  3. spConfig JS代码中

任何从第一个位置获取数据的尝试(data-label元素的a属性)都会产生None

当我使用以下代码时:

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
getgetsize = str([e.get_text() for e in getsize.findAll('option', attrs={'price': '0'})])

我什么都没得到,就好像那个属性的option元素不存在一样。

当我运行此代码时:

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
getgetsize = str([e.get_text() for e in getsize.findAll('option')])

我只获得了第一个结果,即Choose an Option...

有谁知道如何获取我追求的数据?提前致谢。

编辑:这是绕过保护的片段:

        headers = {
            'Host': 'www.kicksusa.com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/72.0.3626.121 Safari/537.36',
            'DNT': '1',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
            'Cookie': 'visid_incap_459049=Evije6RoRAG1GuxEpbckJA4Ch1wAAAAAQUIPAAAAAABk8hUjgpv63FQ2WQOlcukw; incap_ses_1079_459049=UXVgNfGObEuAWEiyCWH5DiGJm1wAAAAA4XovM6FTnjT4ZWyukyoWxw==',
        }
        data2 = requests.get(url3, headers=headers)
        soup2 = BeautifulSoup(data2.text, 'html.parser')

您必须通过打开kicksusa.com并转到Cookies-> kicksusa.com来编辑visid_incap_...=...incap_ses_...=...值。

python web-scraping beautifulsoup
2个回答
0
投票

使用findAll()可以获得多个组,并且需要通过egroup(0)访问它们:

size = soup2.find('dd', attrs={'class': 'last'})
getsize = size.find('select')
for e in getsize.findAll('option')]):
      l = len(e)
      for i in l:
            getgetsize[i] = str(e.group(i).get_text()) 

0
投票

我一直试图从石头上取血。我正在寻找的数据根本不存在 - 该网站做了一些JS DOM操作。这样做的唯一方法(据我所知)是获取spConfig JS代码并使用正则表达式从那里获取数据。我现在要摆弄正则表达式,感谢大家的想法和帮助!

© www.soinside.com 2019 - 2024. All rights reserved.