【问题标题】:Beautifulsoup for row loop only runs once?Beautifulsoup for row 循环只运行一次?
【发布时间】:2013-04-09 17:31:36
【问题描述】:

我几乎完成了一个抓取桌子的网络爬虫。这仅输出表中的第一行。任何人都可以帮助确定为什么这不会返回表中的所有行。请忽略 while 循环,因为这最终会有一个循环部分。

import urllib
from bs4 import BeautifulSoup

#file_name = "/user/joe/uspc-cpc.txt
#file = open(file_name,"w")
i=125
while i==125:
    url = "http://www.uspto.gov/web/patents/classification/cpc/html/us" + str(i) + "tocpc.html"
    print url + '\n'
    i += 1
    data = urllib.urlopen(url).read()
    print data
    #get the table data from dump
    #append to csv file
    soup = BeautifulSoup(data)
    table = soup.find("table", width='80%')
    for tr in table.findAll('tr')[2:]:
        col = row.findAll('td')
        uspc = col[0].get_text().encode('ascii','ignore')
        cpc1 = col[1].get_text().encode('ascii','ignore')
        cpc2 = col[2].get_text().encode('ascii','ignore')
        cpc3 = col[3].get_text().encode('ascii','ignore')
        print uspc + ',' + cpc1 + ',' + cpc2 + ',' + cpc3 + '\n'
        #file.write(record)

#file.close()

我正在运行的代码:

import urllib
from bs4 import BeautifulSoup

#file_name = "/users/ripple/uspc-cpc.txt"
#file = open(file_name,"w")
i=125
while i==125:
    url = "http://www.uspto.gov/web/patents/classification/cpc/html/us" + str(i) + "tocpc.html"
    print 'Grabbing from: ' + url + '\n'
    i += 1
    #get the table data from the page
    data = urllib.urlopen(url).read()
    #send to beautiful soup
    soup = BeautifulSoup(data)
    table = soup.find("table", width='80%')
    for tr in table.findAll('tr')[2:]:
        col = tr.findAll('td')

        uspc = col[0].get_text().encode('ascii','ignore').replace(" ","")
        cpc1 = col[1].get_text().encode('ascii','ignore').replace(" ","")
        cpc2 = col[2].get_text().encode('ascii','ignore').replace(" ","")
        cpc3 = col[3].get_text().encode('ascii','ignore').replace(" ","").replace("more...", "")
        record = uspc + ',' + cpc1 + ',' + cpc2 + ',' + cpc3 + '\n'
        print record
        #file.write(record)

#file.close()

【问题讨论】:

  • 您没有定义row
  • @Marjin Pieters:如何定义行?输出为一行:125/901,H 03H 3/02,B 28D 5/00,H 03H 3/04,B 23D 47/005,B 24B 37/08more...

标签: python loops beautifulsoup


【解决方案1】:

您使用tr 作为循环变量,但在循环中引用row。如果你之前定义了row,它可能会产生令人困惑的结果。

for tr in table.findAll('tr')[2:]:
    col = tr.findAll('td')

为我工作:

125/1,B 28D 1/00,B 28D 1/221,E 01C 23/081,B 28D 1/005,B 28D 1/06more...

125/2,B 23Q 35/10,B 22C 9/18,B 23B 5/162,B 23D 63/18,B 24B 53/07more...

125/3,B 28D 1/18,B 28D 1/003,B 28D 1/048,B 28D 1/181,B 24B 7/22more...

等等

【讨论】:

  • 我都改成了tr。我仍然只打印了一行。
  • @JosephLee:不是您发布的代码。我所做的一次更正对我有用。
  • 太奇怪了。我仍然只打印了一行代码。汤打印出来后。虽然这是最后一行...所以我不知道该怎么想... 125/901,H03H3/02,B28D5/00,H03H3/04,B23D47/005,B24B37/08
  • 我取消了写入文件选项的注释,但仍然只得到文件中的一行输出。这是表格的最后一行
  • @Joseph Lee 请发布整个代码。我感觉您的代码与您在此处提供的代码有些不同。
最近更新 更多