【问题标题】:Need help figuring out how to loop through indice需要帮助弄清楚如何遍历索引
【发布时间】:2019-05-30 12:35:18
【问题描述】:

我正在从事一个以抓取大量数据为主题的项目。我现在正在编写一个相当长的脚本,但我的 for 循环遇到了问题。

我正在尝试从 9 行表中提取信息。我试图设置一个 for 循环,以便它从每一行中抓取相同的信息。为了访问第一行,我将表格拆分为一个列表。第一行从第三个索引开始。

这是我的代码:

当我运行它时,“Aa”行的“AttributeError”已打开。错误显示,“'NoneType' 对象没有属性 'text'”

当我将该行代码单独输入控制台时,不会发生这种情况,我会得到所需的文本。当我取出 for 循环时,我可以抓取第一个 indaplaybox。

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url ='Myurl/=' + page

uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")
boxes = page_soup.findAll("table",{"class":"TableTable tableBody"})
box = boxes[0]
playboxes = box.find_all('tr')
indaplaybox = playboxes[3]

filename = "QBS.csv"
f = open(filename, "a")

headers= "Aa, Ab, Ac, Ad\n"
f.write(headers)

for indaplaybox in playboxes:

    Aa = indaplaybox.find('td', attrs = {'style' : 'font-weight: bold;'}).text

    c = indaplaybox.find('td', attrs = {'class' : 'tablePlayName'})
    cl = c.text.split() 
    Ab = cl[0] + " " + cl[1]
    Ac = cl[2]
    Ad = indaplaybox.div.a.text



    print("Aa:" + Aa)
    print("Ab:" + Ab)
    print("Ac:" + Ac)
    print("Ad:" + Ad)


    with open (filename, "a") as myfile:
        myfile.write(Aa + "," + Ab + "," + Ac.replace(",", "|") + "," + Ad + "\n")
f.close()

我想遍历播放框索引 3-11。

我不熟悉索引,所以尝试做类似的事情:

p = [str(i) for i in range (3,12)] 
indaplaybox = playboxes[p]

for indaplaybox in playboxes:

    rest of code

但这不起作用,因为对大多数人来说可能很明显的是列表索引必须是整数。

我真的需要一些帮助来思考如何让这个 for 循环顺利运行。谢谢!

【问题讨论】:

  • 这可能是因为 bsoup 没有为您请求的查询找到任何内容。如果找不到任何东西,我认为它会返回 None
  • 第一直觉是indaplaybox.find('td', attrs = {'style' : 'font-weight: bold;'}) 正在返回None,而您不能就此致电.text。我看到你可能重复了一些变量名; indaplaybox = playboxes[3]。如果是我,我会删除或更改该行以确保不是问题所在,然后 print(indaplaybox.find('td', attrs = {'style' : 'font-weight: bold;'})) 不调用 .text 并查看返回的内容
  • 感谢大家的帮助!

标签: python for-loop web-scraping indices


【解决方案1】:

你可以这样做:

方法一:

# p has all the values from playboxes at these indexes
p = [playboxes[i] for i in range(3,12)]

# now simple loop
for indaplaybox in p:
    ......

方法二:

for indaplaybox in playboxes[3:12]:
    ....

【讨论】:

  • 如果我错了,请纠正我,但是您不只是从列表中取出值,根据它们的索引按顺序将它们添加到新列表中,然后遍历新列表吗?你不妨只做p=playboxes.copy()for indiaplaybox in p[3:12]...
  • @G.Anderson 是的,你是对的,事实上这更容易。我会添加它。
  • 你们都太棒了。非常感谢您的帮助!
【解决方案2】:
p = [str(i) for i in range (3,12)] 
for i in p:
    indaplaybox = playboxes[i]
    ...
    rest of the code

【讨论】:

  • 知道了!感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多