使用python和beautifulsoup进行Webscraping并不会返回所有请求的数据

时间:2017-09-20 12:05:51

标签: python web-scraping beautifulsoup

我正试图为所有NSN搜索此站点 https://www.iso-group.com/fsg/Mechanical-Power-Transmission-Equipment/Gears-Pulleys-Sprockets-Transmission-Chain/3020_GEAR-SPUR/1 使用以下代码

 import requests
 from bs4 import BeautifulSoup
 import urllib3

 from datetime import datetime, timedelta



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

f = open("GEAR SPUR.csv", "w")

headers = "NSN, Part_Name, \n"
f.write(headers)

for page in range(69):
    NSNurl = 'https://www.iso-group.com/fsg/Gears-Pulleys-Sprockets-Transmission-Chain/Mechanical-Power-Transmission-Equipment/3020_GEAR-SPUR/'.format(page)

    uClient = requests.get(NSNurl)

    page_html = uClient.content

    # close client
    uClient.close()
    page_soup = soup(page_html, "html.parser")
    container = page_soup.find_all("table", {"class": "table table-hover table-responsive"})


   for container1 in container:    #container1 is <td> element
       NSN = container1.find('td')
       nsn = container1.find('a') #get the anchor from the <td>
       if nsn is not None:        #if an anchor is found
          NSN = nsn.contents[0]
          print(nsn.contents[0]) #print it
       else:
          Nomenclature = container1.text
          print(NSN) 

          f.write(NSN + "," + Nomenclature.replace(",",""))
  f.close()

它仅适用于第一个数字,它返回的是一遍又一遍的相同数字。这些是我终止之前的输出

 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495
 3020-00-449-0495 - 3020004490495

为什么要这样做?如何修复它以返回所有数字?

2 个答案:

答案 0 :(得分:0)

您的网址在字符串中没有占位符供您的网页编号使用。您需要在字符串中包含{},否则.format(page)不会执行任何操作。目前您的网址永远不会更改。根据您的评论,将您的网址更改为

NSNurl = 'https://www.iso-group.com/fsg/Gears-Pulleys-Sprockets-Transmission-Chain/Mechanical-Power-Transmission-Equipment/3020_GEAR-SPUR/{}'.format(page)

花括号作为占位符,当你执行.format时,会为占位符替换值。有关格式化字符串的详细信息,请查看here

我也会看到罗马在解决标记方面的答案

您可能遇到的另一个问题是您获取NSN / nsn /命名法的实际代码有点难以解密,并且只有在nsn is None时才会实际保存到您的csv,即使您正在打印输出对于这两种情况。

希望这足以帮助您修复代码。如果您仍有问题,请澄清问题。

答案 1 :(得分:0)

你在这一行中遇到的另一个问题是:

container = page_soup.find_all("table", {"class": "table table-hover table-responsive"})

您正在尝试遍历container,但它的长度为1。

您可能应该像这样修改一行:

container = page_soup.find("table", {"class": "table table-hover table-responsive"}).find_all('tr')