BeautifulSoup 从一组输出子项中选择一个子项
BeautifulSoup selecting one child from an array of output children
我正在尝试抓取 Yahoo 的一只股票 table。我想为每一行打印出 table 值(有效)。:
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'']
我想做的是 select 第一个子元素/元素(股票代码,在 "AMAT" 上方),这样我就可以传递它。
如果我用
print tdrow[0]
它会产生一个错误
IndexError: list index out of range
如果我从 "print tdrow[0]" 中删除缩进,它会起作用(我可以指定 [0] 并获得 "PK",[1] 并获得 "Applied Materials Inc.",但它仅适用于最后一行 - 我想对每一行使用 [0](在 "for tr in table_row" 循环中)。
我错过了什么?
我认为这是因为第一行是空的(不知道为什么)所以 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'']
我正在尝试抓取 Yahoo 的一只股票 table。我想为每一行打印出 table 值(有效)。:
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'']
我想做的是 select 第一个子元素/元素(股票代码,在 "AMAT" 上方),这样我就可以传递它。
如果我用
print tdrow[0]
它会产生一个错误
IndexError: list index out of range
如果我从 "print tdrow[0]" 中删除缩进,它会起作用(我可以指定 [0] 并获得 "PK",[1] 并获得 "Applied Materials Inc.",但它仅适用于最后一行 - 我想对每一行使用 [0](在 "for tr in table_row" 循环中)。
我错过了什么?
我认为这是因为第一行是空的(不知道为什么)所以 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'']