【问题标题】:Why doesn't my html parser download the entire html documentation?为什么我的 html 解析器没有下载整个 html 文档?
【发布时间】:2019-10-28 03:45:01
【问题描述】:

我正在使用 Beautiful Soup 来抓取以下页面:https://www.nyse.com/quote/XNYS:AAN

我想把股票值下面的名字+缩写。但是,当我运行脚本时,soup.find() 似乎不起作用,因为没有下载整个 html 文件。

main_url = "https://www.nyse.com/quote/XNYS:AAN"

import requests
result = requests.get(main_url)

from bs4 import BeautifulSoup
soup = BeautifulSoup(result.text, 'html.parser')

print(soup.find("div", class_ = "d-dquote-symbol").prettify())

我希望看到包含正确库存值的<span><div>。但是,打印返回“none”,因为脚本找不到此标记。我知道它存在是因为我首先使用了检查元素来查找标签。

【问题讨论】:

  • Inspect 也会显示动态元素。使用查看源代码检查它是否真的存在。
  • 使用浏览器的inspect功能向浏览器显示DOM 解释 HTML,也可以用Java Script修改和扩展代码.所有浏览器都有另一个功能来显示实际的未渲染器 HTML 源代码。这就是 beautifulsoup 看到和操作的内容。

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


【解决方案1】:

发生这种情况是因为您正在抓取的页面不是静态的。

您可以在显示值之前看到它有一个“微调器”,或者通过检查浏览器调试工具中的network 选项卡。

requests.get 不会发出任何“后续”请求,因此您只会得到空页面。

要获取库存值(通过 HTML 抓取...),您应该使用网站本身用来获取库存值的请求。

注意:最好找官方 API 来获取这种结构化数据。

【讨论】:

【解决方案2】:

您可以使用任何浏览器模拟器来获取报价。 pyppeteer 可能是一个不错的选择。该脚本将等待报价可用,然后对其进行解析。

import asyncio
from pyppeteer import launch

url = "https://www.nyse.com/quote/XNYS:AAN/QUOTE"

async def get_quote(link):
    wb = await launch()
    page = await wb.newPage()
    await page.goto(link)
    await page.waitForSelector(".d-dquote-bigContainer [class^='d-dquote-x']")
    container = await page.querySelector(".d-dquote-bigContainer [class^='d-dquote-x']")
    quote = await page.evaluate('(element) => element.innerText', container)
    print(quote)

asyncio.get_event_loop().run_until_complete(get_quote(url))

此时输出:

60.09

【讨论】:

  • 运行此代码时,出现以下错误:加载共享库时出错共享库:libX11-xcb.so.1:无法打开共享对象文件:没有这样的文件或目录
  • 我猜你还没有正确安装pyppeteer。您是否尝试过运行任何示例 sn-ps 以确保 pyppeteer 在您的机器上工作?谢谢。
  • 我在一个 web python IDE 上运行它。我认为这就是存在问题的原因。
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2015-03-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多