Python 从graphicView.bidvalue获取值

Python 从graphicView.bidvalue获取值,python,css,web,web-scraping,beautifulsoup,Python,Css,Web,Web Scraping,Beautifulsoup,我需要使用python中的Beauty Soup从这段代码中获得52329的值。我该怎么做才能正确地做呢 <span class="chart-info-val ng-binding" ng-bind="graphicView.bidvalue">5,2329</span> Ps:没有代码,所以我只能假设某些事情 代码示例 解释 select方法使用CSS选择器获取由beautifulsoup解析的HTML soup.select

我需要使用python中的Beauty Soup从这段代码中获得52329的值。我该怎么做才能正确地做呢

<span class="chart-info-val ng-binding" ng-bind="graphicView.bidvalue">5,2329</span>

Ps:没有代码,所以我只能假设某些事情

代码示例 解释 select方法使用CSS选择器获取由beautifulsoup解析的HTML

soup.select('span.chart-info-val ng-binding').get_text()
上面的例子

  • span
    :抓取任何span标签
  • :表示CSS中的类,此处该类为图表信息值绑定
  • get_text()
    :使用类图表信息值绑定从span中获取文本
找到URL后,我明白了为什么您无法获取内容。正如我所解释的,浏览器以三种主要方式加载信息。HTML、CSS和Javascript。HTML严格用于文本和页面标记,CSS用于样式和Javascript可以进行各种排序,包括生成数据。在这里,每次你刷新页面时,网站都会发出一个服务器调用来获取股价数据,然后显示出来。它没有硬编码到HTML中,javascript正在嵌入它

如果没有帮助,BeautifulSoup无法处理javascript生成的网站

补充资料 一般来说,动态获取数据有三种方法

  • 反向工程HTTP请求
  • 这是因为javascript正在对服务器进行调用,如果我们能够模拟这些请求,就应该能够获得我们想要的数据。这种方法的优点是快速有效。与其他方法不同。这通常只需要发出一个简单的HTTPGET/post请求,但也可能需要添加诸如头、cookie和参数之类的内容

  • 使用splash预呈现页面
  • Splash框架可以预呈现页面,即捕获文档DOM,并允许您选择所有文档DOM。它的效率不如反向工程HTTP请求,但它是一种相对轻量级的方法

  • 呈现页面并使用浏览器活动
  • 您可以使用selenium软件包来模拟浏览器活动,愚弄正在使用浏览器的网站。它是重量级的,而且这个框架从来没有真正用于webscraping,而是用于自动化测试。本质上,selenium webdriver提供了一个HTTP服务器,一个与浏览器的安全连接。然后,我们可以通过向该服务器发送HTTP请求来执行任何浏览器活动,并将webdriver定向到一种特殊类型的浏览器进行自动测试。根据您的数据需求,这将成为一种缓慢的方法

    代码更新 话虽如此,你想要数据的网站实际上很容易获得你想要的信息。我们可以通过反向工程HTTP请求来实现这一点。从本质上讲,该网站正在向服务器发出HTTP get请求,然后响应显示股票价格

    为了了解网站是如何做到这一点,我们必须能够检查请求。使用chrometools这是很容易的。如果加载页面,右键单击inspect,您将看到一个包含HTML代码的窗口。如果单击网络选项卡,您可以看到所有请求的列表

    下面是一些图片,指导您浏览HTTP请求。我们实际上是在记录浏览器的活动。在XHR中,即XMLHttpRequest,它引用javascript生成的获取数据的请求,这就是可以找到数据的地方。我们在请求中单击,然后单击预览,直到看到请求中需要的数据。然后右键单击并复制CURL BASH命令,并将其粘贴到CURL.trillworks.com这样的网站上。在这里,我们可以将请求转换为python。这为我们提供了良好的格式化头/参数/cookies,使请求看起来真实

    图像:

    所以现在我们有了正确的URL来发出请求,再加上任何标题。首先,值得在服务器上尝试requests-get方法。如果幸运的话,不需要包含头/参数。通过测试,您唯一需要做的就是使用参数并发出get请求,而不需要使用头。 以下是HTTP请求的详细信息

    url = 'https://api.cotacoes.uol.com/asset/intraday/list/'
    params = (('format', 'JSON'),
             ('fields', 'price,high,low,open,volume,close,bid,ask,change,pctChange,date'),
             ('item', '704'),
             ('', ''),)
    headers = {
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'https://economia.uol.com.br/cotacoes/bolsas/acoes/bvsp-bovespa/wege3-sa',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}
    
    有了它,您可以使用下面的代码进行一些测试。事实证明,您不需要这些标题,它只需要参数

    编码示例 输出 解释 这里我们从curl.trillworks.com获取了参数,并使用图像中的URL,使用这些特定参数发出get请求。我们得到的响应称为JSON对象。json()方法将此json对象转换为可操作的python字典。在这里,您可以看到所需数据的输出

    为了得到你想要的数据,我们必须通读这本字典。您可以在字典的文档部分看到所需的数据

    data = response.json()['docs']
    
    输出:

    [{'price': 58.09,
      'high': 58.46,
      'low': 54.7,
      'open': 55.03,
      'volume': 6435500,
      'close': 54.55,
      'bid': 58.09,
      'ask': 58.11,
      'change': 3.54,
      'pctChange': 6.49,
      'date': '20200717170900'},
    
    现在我们可以看到价格嵌套在一个列表中

    data = response.json()['docs'][0]['price']
    
    输出
    通过一些工作,您可以非常高效地获取数据。

    看起来您的代码没有通过。我用我正在使用的代码编辑了这篇文章,我使用了您的方法,输出仍然“[]”您能提供您正在使用的全部代码吗?例如,我没有看到URL。我的回答是基于应该发生什么的假设。由于动态内容,beautifulsoup可能无法解析该页面。url为“”,我正在尝试获取动态生成的58,09span元素。也就是说,网站中的javascript正在生成数据。您需要能够动态地获取这些数据。在网站上,您可以通过反向工程HTTP请求来实现这一点。这有多难?
    {'prev': None,
     'next': None,
     'docs': [{'price': 58.09,
       'high': 58.46,
       'low': 54.7,
       'open': 55.03,
       'volume': 6435500,
       'close': 54.55,
       'bid': 58.09,
       'ask': 58.11,
       'change': 3.54,
       'pctChange': 6.49,
    
    data = response.json()['docs']
    
    [{'price': 58.09,
      'high': 58.46,
      'low': 54.7,
      'open': 55.03,
      'volume': 6435500,
      'close': 54.55,
      'bid': 58.09,
      'ask': 58.11,
      'change': 3.54,
      'pctChange': 6.49,
      'date': '20200717170900'},
    
    data = response.json()['docs'][0]['price']
    
    58.09