【问题标题】:Can not find div embeded in another div using beautifulsoup 4使用beautifulsoup 4找不到嵌入另一个div的div
【发布时间】:2021-10-18 20:54:33
【问题描述】:

我是使用 beautifulsoup 的新手

这是我当前的代码

import requests, json
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}

s = requests.Session()
res = s.get("https://www.myntra.com/jordan", headers=headers, verify=False)

src = res.content
soup = BeautifulSoup(src, 'lxml')
links = soup.find_all("a")
urls = []

for div in soup.find_all("div", attrs={'id':"mountRoot"}):
    print(div)
    print("\n")
    for div_tag in div.find_all('div'):
        print(div_tag)
        embedded_div = div_tag.find('div')
        print(embedded_div)
    

这段代码的输出:

<div id="mountRoot" style="min-height:750px;margin-top:-2px">< div class="loader-container">< div class="spinner-spinner">< /div>< /div>< /div>

<div class="loader-container">< div class="spinner-spinner">< /div>< /div>
<div class="spinner-spinner">< /div>
<div class="spinner-spinner">< /div>

这是我正在查看的网站的检查元素 :https://i.stack.imgur.com/zui3R.png

对我来说,它似乎忽略了

我做错了什么?任何帮助都会得到帮助

【问题讨论】:

  • 通常当你看到一个带有inspect和beautifulsoup的元素什么都不返回时,这意味着页面被javascript修改了。在您的特定情况下,大部分数据都存储在脚本标签中
  • 该页面可能正在由 JavaScript 加载。使用硒。

标签: python-3.x web-scraping beautifulsoup


【解决方案1】:

似乎第一行缓存到页面中的script 标记中,属性为type="application/ld+json",如下所示:

<script type="application/ld+json">{ some big json here }</script>

您可以通过选择带有键@type:"ItemList"的json来获取数据,然后获取项目:

import requests, json
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}

s = requests.Session()
res = s.get("https://www.myntra.com/jordan", headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')

data_json = [ 
    json.loads(t.text)
    for t in soup.findAll("script",{"type":"application/ld+json"})
]
data = [
    t
    for t in data_json
    if t["@type"] == "ItemList"
]
print(data[0]["itemListElement"])

但它只会打印几行,为了获取分页数据,有一个API:

GET https://www.myntra.com/gateway/v2/search/jordan

以下将使用 API 获取第一页:

import requests

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}

s = requests.Session()
s.get("https://www.myntra.com/jordan", headers=headers)

# first page
r = s.get("https://www.myntra.com/gateway/v2/search/jordan",
    params = {
        "p": "1",
        "rows": 50,
        "o": 0,
        "plaEnabled":"false"
    },
    headers=headers
)
print(r.json())

您需要增加p 才能移至下一页。 o 也是偏移量索引,您将每次将其递增per_page - 1。例如,如果您设置了"rows":50,则第二页将有"o":49

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2017-06-30
    • 2023-04-04
    • 2023-03-03
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多