如何在Beautifulsoup4 for Python 3.6中使用soup.find()单独输出结果?

时间:2018-06-04 21:33:14

标签: python beautifulsoup

我试图从网站上获取股票代码的价格,而在检查工具中股票价格看起来就像是由这条线确定的:

<meta itemprop="price" content="274.9">

我在python中的代码看起来像这样

import urllib.request
from bs4 import BeautifulSoup

quote_page = 'https://www.bloomberg.com/quote/SPY:US'
page = urllib.request.urlopen(quote_page)
soup = BeautifulSoup(page.read(), 'html.parser')
price_box = soup.find('meta', {"itemprop" : "price"})
print(price_box)

但是在终端中它会打印包含单词&#34; price&#34;的所有元内容。在一开始的时候。像priceChange,priceCurrency等我只想要&#34; price&#34;的结果。它也将显示如下:

<meta content="274.9" itemprop="price"> <meta content="1.3" itemprop="priceChange"> <meta content="0.475146" itemprop="priceChangePercent"> <meta content="2018-06-04T20:15:05.000Z" itemprop="quoteTime"> <meta content="USD" itemprop="priceCurrency"> </meta></meta></meta></meta></meta>

如何只显示数字?

1 个答案:

答案 0 :(得分:0)

首先,它实际上并没有找到多个值;其他meta代码以itemprop开头price的事实纯粹是巧合。 find调用始终只找到一个标记。而且,即使您使用find_all,它也会为您提供该标签的列表。问题是它是一个嵌套标签,其中包含其中的所有其他标签。

如果你看一下HTML,这不是实际存在的。标签都是"schema-org-financial-quote" div的{​​{1}}的自封闭独立子项,而不是彼此嵌套。

问题似乎是这个HTML无效,itemscope猜测它与浏览器的方式不同。

据我所知,通过浏览规范,html.parser中为meta提供body的{​​{1}}代码不应该被关闭。但该页面具有自动关闭的itemprop标记。

人类读这个的显而易见的方法就是忽略关闭并将它们视为它们看起来的独立兄弟姐妹。这至少是Chrome和Firefox的作​​用。 (有趣的是,至少在Chrome中,itemscope中的自动关闭meta代码与meta中的自动关闭head itemprop代码的处理方式不同,这意味着它可能故意在这样的错误页面上工作。)

但是meta做了一些不同的事情,而是把每一个都嵌入到前一个中。

如果我认为HTML实际上是无效的,那么从技术上讲这不是一个错误。但是更好地处理这个问题可能会更好。从Python 2.7 / 3.2开始,body应该像浏览器一样“宽松”,并且它不会在这里做什么浏览器。所以,你可能想要search for a bug on this, and file one if it doesn't exist。 (但是,即使它固定在Python 3.7.1或3.8中,当有人在3.6.4中运行你的代码时,这也无济于事。)

如果您可以使用html.parserhtml.parser代替lxml,则可以解决您的问题 - 这两个问题碰巧都会像Chrome一样解析这些代码,这大概就是你的意思想。

但是......你真的需要解决这个问题吗?如果您只想要html5lib标记的html.parser,那已经有效:

content