【问题标题】:Why is the HTML from a website different from the HTML that Python's request library gives?为什么来自网站的 HTML 与 Python 的请求库提供的 HTML 不同?
【发布时间】:2018-02-19 01:39:06
【问题描述】:

我正在努力让自己熟悉 requests 和 BeautifulSoup,所以我给了自己一个小项目。我正在尝试制作一个在Footlocker的发布日历上显示鞋子的程序 (https://www.footlocker.com/release-dates/) 像这样:

  • 鞋名#1 日期#1
  • 鞋名#2 日期#2
  • 鞋名#3 日期#3
  • 鞋名#4 日期#4

到目前为止,我有这个:

import requests as req
from bs4 import BeautifulSoup

def main():
    url = "https://www.footlocker.com/release-dates/"
    resp = req.get(url)

    soup = BeautifulSoup(resp.content, "html.parser")
    print(soup)

但是,当我加载 HTML 以使用 BeautifulSoup 解析时,包含鞋子日期和名称信息的 HTML 代码不会像我直接在网站上使用检查元素时那样显示。我认为这是因为带有鞋子信息的 HTML 是由 Javascript 生成的。如果是这样,我该如何加载它的请求?

谢谢。

【问题讨论】:

  • 学习和使用Selenium

标签: python html web-scraping beautifulsoup python-requests


【解决方案1】:

如果你的机器上安装了 selenium,没关系,否则,安装它。这是你的方法。

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get("https://www.footlocker.com/release-dates/")
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
for item in soup.select(".day"):
    shoe = item.select_one(".productName").get_text()
    date = item.select_one(".date").get_text()
    print(shoe,date)

部分结果:

Jordan Retro 1 HI OG 1Aug
Kids' Jordan Retro 1 HI OG 1Aug
Jordan Retro 1 HI OG 1Aug
Kids' Jordan Retro 1 HI OG 1Aug
Nike Kobe A.D. NXT 1Aug
Nike Dualtone Racer 1Aug

【讨论】:

    【解决方案2】:

    你不能用requests加载它,你可以并且应该用它来加载的是seleniumChromeDriver(或任何其他浏览器),一旦使用它,您甚至不需要使用bs4 进行解析工作:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("https://www.footlocker.com/release-dates/")
    
    names = driver.find_elements_by_class_name("productName")
    names = [name.text for name in names]
    days = driver.find_elements_by_class_name("days")
    days = [day.text for day in days]
    months = driver.find_elements_by_class_name("month")
    months = [month.text for month in months]
    
    dates = list(zip(days, months))
    data = list(zip(names, dates))
    

    由于所有产品的名称都在<div class="productImage"></div> 标签中,因此很容易使用.find_elements_by_class_name 获取所有元素,然后使用list comprehension 语法来获取所有所需元素的文本。相同的过程用于查找所有日期和月份文本。

    因为它们在解析时都是有序的,所以使用zip 是一种方便的方法,可以将它们全部放在一个大的元组列表中。 data 中的项目的演示如下:

    >>> data[:10]
    [('Jordan Retro 1 HI OG', ('1', 'Aug')), ("Kids' Jordan Retro 1 HI OG", ('1', 'Aug')), ('Jordan Retro 1 HI OG', ('1', 'Aug')), ("Kids' Jordan Retro 1 HI OG", ('1', 'Aug')), ('Nike Kobe A.D. NXT', ('1', 'Aug')), ('Nike Dualtone Racer', ('1', 'Aug')), ('Nike Duelist Racer', ('1', 'Aug')), ('Jordan Super.Fly 2017', ('3', 'Aug')), ("Kids' Jordan Super.Fly 2017", ('3', 'Aug')), ('Nike Air VaporMax Flyknit', ('3', 'Aug'))]
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2023-03-17
      • 2021-10-07
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多