python 3 bs4如何在某些div下选择跨度值

时间:2017-06-15 19:12:54

标签: python python-3.x beautifulsoup

使用python3和bs4我在选择两个不同div下的两个spans值时遇到问题。

我想实现以下目标。

1。)在lastPriceChg div下选择" chg chgUp"值。注意:这也可以是" chg chgDown"。即。

<div class="lastPriceChg"><span class="price">0.023</span><span class="chg chgUp">0.0001 (0.44%)</span></div>

2。)有多个&#34;面板&#34; div但我想要volumeFormatted值。即。

<div class="panel">
                <strong glossaryid="volume">Volume</strong>
                <span class="value" val="volumeFormatted">3,851,529</span>
                <strong class="under">Dividend</strong>
                <span class="value"><span formatcall="toPrice" val="dividend">N/A</span></span>
            </div>

真正奇怪的是,如果我将网页html粘贴到html_doc中就可以了......

这是我的非工作当前代码:

url = ('https://www.otcmarkets.com/stock/VDRM/quote')
page = urllib.request.urlopen(url).read()
soup = BeautifulSoup(page, "lxml")

for item in soup.findAll('span', attrs={'class': 'value'}):
    print(item.text.strip()

仅从体积中取样:

$ python scraper.py 
Get Change


 - 
 - 

以下工作正常:

html_doc = """
<div class="panel">
                <strong glossaryid="volume">Volume</strong>
                <span class="value" val="volumeFormatted">3,105,009</span>
                <strong class="under">Dividend</strong>
                <span class="value"><span formatcall="toPrice" val="dividend">N/A</span></span>
            </div>
"""
soup = BeautifulSoup(page, "lxml")

for item in soup.findAll('span', attrs={'class': 'value'}):
    print(item.text.strip()

仅从体积中取样:

$ python scraper.py 
Get Change
3,105,009
N/A

那么为什么在实际阅读网站时这不起作用?

编辑:这是我正在寻找的跨度类的检查员的屏幕截图: inpect screen shot of spans

2 个答案:

答案 0 :(得分:0)

信不信由你,你想要的东西确实没有出现在我收到的页面中。我想这是因为你生活在一个不同的地缘政治区域。这就是HTML的有趣区域。contents of div missing除此之外,其他项目的文本也是空的。

不管。我在您的图片的HTML中添加了第一个div中缺少的内容,我可以展示如何在问题的第二部分得到您想要的内容而不需要这样做。

我打开添加了内容的HTML文件。我要对你说的主要是你可以通过以下方式直接指定你想要的span元素。

>>> soup = bs4.BeautifulSoup(open('temp.htm').read(),'lxml')
>>> spans = soup.findAll('span', attrs={'class': 'chg'})
>>> spans[0].text
'0.0022 (9.17%)'
>>> spans_2 = soup.findAll('span', attrs={'val': 'dividend'})
>>> spans_2[0].text
'\n'

不幸的是,我无法保证这对您有用。

答案 1 :(得分:0)

正如我在评论中提到的,这是使用替代来源的新代码。它比我现在想的更容易,因为我实际上得到了返回数据。 =)

url = ('http://www.marketwatch.com/investing/stock/vdrm')
page = urllib.request.urlopen(url).read()
soup = BeautifulSoup(page, "lxml")
vol = soup.find('span', attrs={'class': 'volume last-value'})
volume = vol.text.strip()
chg = soup.find('span', attrs={'class': 'change--percent--q'})
change = chg.text.strip()
print ("Vol: {} Change: {}".format(volume, change))