【问题标题】:BeautifulSoup selecting one child from an array of output childrenBeautifulSoup 从一组输出孩子中选择一个孩子
【发布时间】:2018-05-05 10:48:16
【问题描述】:

我正在尝试抓取雅虎的一张股票表。我想打印出每一行的表值(有效)。:

from bs4 import BeautifulSoup as bsoup
import urllib2
import re

url = "https://finance.yahoo.com/screener/predefined/undervalued_growth_stocks"

table_page = urllib2.urlopen(url)
soup = bsoup(table_page,'html.parser')

table = soup.find('table')

table_rows = table.find_all('tr')

for tr in table_rows:
    td = tr.find_all('td')
    tdrow = [i.text for i in td]
    print tdrow

这工作正常,并产生(对于每一行),这个:

[u'AMAT', u'Applied Materials, Inc.', u'58.71', u'+1.09', u'+1.89%', u'7.364M', u'10.282M', u'62.614B', u'20.87', u'']
[u'PK', u'Park Hotels & Resorts Inc.', u'29.01', u'+0.34', u'+1.19%', u'628,369', u'1.216M', u'6.233B', u'2.49', u'']

我想做的是选择第一个子/元素(股票代码,在“AMAT”上方),以便我可以传递它。

如果我使用

print tdrow[0]

它会产生错误

IndexError: 列表索引超出范围

如果我从“print tdrow[0]”中删除缩进,它可以工作(我可以指定 [0] 并获取“PK”,[1] 并获取“Ap​​plied Materials Inc.”,但它仅适用于最后一个row - 我想对每一行使用 [0](在“for tr in table_row”循环中)。

我错过了什么?

【问题讨论】:

    标签: python beautifulsoup children


    【解决方案1】:

    我认为这是因为第一行是空的(不知道为什么)所以print tdrow[0] 会抛出一个越界。但是其余的行都很好,因此将打印移出循环将引用最后一行,这有效。

    所以检查该行是否存在应该可以解决。

    这是我在运行您的代码时得到的输出,与上面块中显示的完全一样,请注意第一行是空的。

    []
    [u'AMAT', u'Applied Materials, Inc.', u'58.74', u'+1.12', u'+1.94%', u'7.725M', u'10.282M', u'62.64B', u'20.88', u'']
    [u'WBA', u'Walgreens Boots Alliance, Inc.', u'70.885', u'+0.105', u'+0.148%', u'4.947M', u'7.65M', u'71.562B', u'17.90', u'']
    
    .
    .
    .
    
    [u'PLD', u'Prologis, Inc.', u'67.29', u'+0.85', u'+1.28%', u'841,231', u'1.969M', u'36.275B', u'20.17', u'']
    [u'PK', u'Park Hotels & Resorts Inc.', u'29.01', u'+0.34', u'+1.19%', u'640,075', u'1.216M', u'6.233B', u'2.49', u'']
    

    【讨论】:

    • 第一行是空的。我会看看我能不能解决这个问题,也许它会起作用。谢谢。
    • 抱歉,我认为您的问题是关于为什么打印会/不会工作 - 而不是为什么行本身是空的。
    • 它可能会在某个地方找到一个杂项td 标记——也许通过 html 搜索并查看所有标记出现的位置。也可能是因为第一个标签内的文本格式不正确或其他原因。
    • 是的,你是对的。第一行是空的(我在 tr 中搜索 td,它不包括第一个表行,即 th)。现在我也使用了find_all('th')print[0] 在循环中工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2014-02-26
    • 2011-08-16
    相关资源
    最近更新 更多