【发布时间】:2018-12-19 10:49:47
【问题描述】:
因此,我的目标是在对许可证代码列表进行迭代后,从网站上抓取 2 个表格(不同格式) - FSC Public Search。我的问题是,因为我想要的两个表 Product Data 和 Certificate Data 有两种不同的格式,所以我必须分别抓取它们。例如网页上的产品数据是普通的"tr"格式,证书数据是"div"格式。
根据我之前提出的问题,我几乎已经解决了我的问题,并且可以在一系列许可证代码中完全检索证书数据(“div”表单)。但是,我无法按我的意愿输出产品数据表。它没有显示 5 个许可证代码的产品数据,而是显示了第一个许可证代码的 5 个副本。我已经尝试将这个抓取放在定义的函数 get_data_by_code 中,但我仍然无法以我想要的格式获取它,它只是 CSV 文件中的一个表。
基本上我不确定在我的函数/脚本中的何处包含此抓取,因此非常感谢您提供任何输入,谢谢。
df3 = pd.DataFrame()
df = pd.read_csv("MS_License_Codes.csv")
codes = df["License Code"]
data = [
('code', code),
('submit', 'Search'),
]
response = requests.post('https://info.fsc.org/certificate.php', data=data)
soup = BeautifulSoup(response.content, 'lxml')
def get_data_by_code(code):
data = [
('code', code),
('submit', 'Search'),
]
response = requests.post('https://info.fsc.org/certificate.php', data=data)
soup = BeautifulSoup(response.content, 'lxml')
#scraping the certificate data
status = soup.find_all("label", string="Status")[0].find_next_sibling('div').text
first_issue_date = soup.find_all("label", string="First Issue Date")[0].find_next_sibling('div').text
last_issue_date = soup.find_all("label", string="Last Issue Date")[0].find_next_sibling('div').text
expiry_date = soup.find_all("label", string="Expiry Date")[0].find_next_sibling('div').text
standard = soup.find_all("label", string="Standard")[0].find_next_sibling('div').text
return [code, status, first_issue_date, last_issue_date, expiry_date, standard]
# Just insert here output filename and codes to parse...
OUTPUT_FILE_NAME = 'Certificate_Data.csv'
df3 = pd.DataFrame()
with open(OUTPUT_FILE_NAME, 'w') as f:
writer = csv.writer(f)
for code in codes:
print('Getting code# {}'.format(code))
writer.writerow((get_data_by_code(code)))
##attempting to scrape the product data
table = soup.find_all('table')[0]
df1, = pd.read_html(str(table))
df3 = df3.append(df1)
df3.to_csv('Product_Data.csv', index = False, encoding='utf-8')
编辑
所以使用下面的代码,我得到了最后一个许可证代码的产品数据的 5 个副本.. 稍微接近了一点,但我仍然不明白为什么会这样
df3 = pd.DataFrame()
for code in codes:
print('Getting code# {}'.format(code))
response = requests.post('https://info.fsc.org/certificate.php', data=data)
soup = BeautifulSoup(response.content, 'lxml')
table = soup.find_all('table')[0]
df1, = pd.read_html(str(table))
df3 = df3.append(df1)
df3.to_csv('Product_Data.csv', index = False, encoding='utf-8')
编辑 2
我一直在使用的示例代码:
codes = ['FSC-C001777', 'FSC-C124838' ,'FSC-C068163','FSC-C101537','FSC-C005776']
格式编辑
这是正确的表格格式,但是如您所见,它是第一个许可证代码中重复 5 次的信息,而不是唯一数据。
【问题讨论】:
-
@MartinEvans 我在下面的编辑 2 中添加了一些。
-
您给出的代码的预期输出是什么?您能否添加 CSV 文件的外观(文本格式)?
-
@MartinEvans 我不确定您所说的文本格式是什么意思,所以我添加了当前输出的屏幕截图,因为它们的格式正确,只有其中一个包含错误的信息。
-
谢谢。首选原始文本而不是屏幕截图。
标签: python html web-scraping beautifulsoup scrapy