如何使用 Python 从 html table 网络抓取数据并将其存储在 csv 文件中。我能够提取一些部分但不能提取其他部分
How to web scrape data using Python from an html table and store it in a csv file. I am able to extract some parts but not the others
我是网络抓取的初学者,我对这个过程非常感兴趣。我为自己设定了一个项目,可以让我在完成项目之前保持动力。
我的项目
我的目标是编写一个 Python 程序,进入我的大学成绩页面并抓取一系列学生的所有成绩,并将他们在每个科目中的每个分数存储在 .csv 文件中,或者,分隔的文本文件。我已经获得了将 post 请求提交到 .asp 页面的代码。如果您能指导我如何将主题详细信息存储在单独的列中,我将不胜感激:
期望输出:
Sl.no,姓名,主题1,主题2,主题3,主题4,主题5,主题6,..等
1,杰森,8,9,8,8,8,9..等
2,彼得,6,8,9,8,7,7..等
.
。
.
一系列考试编号。
尝试一些示例数据
结果网站:http://result.pondiuni.edu.in/candidate.asp
注册号:15te1218
学位: BTHEE
考试:第二
谁能告诉我如何完成任务?
请指正我,如果你能指导我解决问题就太好了。
这可以用更简单的方式完成吗?
在下面的代码中,您可以看到我试图打印出学生的姓名,但它 return 是一个空集(不起作用)。而且我不希望它 return 将数据作为一组,因为该细节只出现一次。
我不知道如何从结果页面的 html table 中提取该学生的主题名称和相应的标记。需要一些帮助。
代码:
import requests
from bs4 import BeautifulSoup
import re
import csv
for x in xrange(44,47):
EXAMNO ='15te12'+str(x)
print EXAMNO
data = {"txtregno": EXAMNO,
"cmbdegree": r"BTHEE~\BTHEE\result.mdb", # use raw strings
"cmbexamno": "B",
"dpath": r"\BTHEE\result.mdb",
"dname": "BTHEE",
"txtexamno": "B"}
results_page = requests.post("http://result.pondiuni.edu.in/ResultDisp.asp", data=data).content
soup = BeautifulSoup(results_page, 'html.parser').prettify()
regpa= "<!--Percentage / S.G.P.A : <b>(.+?) </b> -->"
patterngpa =re.compile(regpa)
gpa=re.findall(patterngpa,soup)
print gpa
rename="<font size=3 color=black>(.+?)</font>"
patternname=re.compile(rename)
name=re.findall(patternname,soup)
print (name)
输出:
15te1244
[u'8.67']
15te1245
[u'8.8']
[]
15te1246
[u'7.8']
[]
如果你能告诉我如何以所需的输出格式打印它会很有帮助。
谢谢。
花了很多时间寻找暴力解决方案。
import requests
from bs4 import BeautifulSoup
import re
import csv
for x in xrange(44,47):
EXAMNO ='15te12'+str(x)
data = {"txtregno": EXAMNO,
"cmbdegree": r"BTHEE~\BTHEE\result.mdb", # use raw strings
"cmbexamno": "B",
"dpath": r"\BTHEE\result.mdb",
"dname": "BTHEE",
"txtexamno": "B"}
results_page = requests.post("http://result.pondiuni.edu.in/ResultDisp.asp", data=data).content
soup = BeautifulSoup(results_page, 'html.parser').prettify()
string=str(BeautifulSoup(results_page, 'html.parser'))
regpa= "<!--Percentage / S.G.P.A : <b>(.+?) </b> -->"
print (re.search(regpa,string,re.M|re.I )).group(1)
regname="<b>Name of the student : <b><font color=\"black\" size=\"3\">(.*)</font></b></b>"
print (re.search(regname,string,re.M|re.I )).group(1)
regsub="66%\"><font color=\"black\" face=\"arial\" size=\"2\">(.*)</font></td>"
matches=(re.findall(regsub,string,re.M|re.I ))
for i in xrange(len(matches)):
regsubm=">"+matches[i]+"</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"2%\"><font color=\"black\" face=\"arial\" size=\"2\">..</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"7%\"><font color=\"black\" face=\"arial\" size=\"2\">[\xc2]?[\xa0]?[\xc2]?[\xa0]?-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"1%\"><font color=\"black\" face=\"arial\" size=\"2\">-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"5%\"><font color=\"black\" face=\"arial\" size=\"2\">-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"5%\"><font color=\"black\" face=\"arial\" size=\"2\">(.*)</font>"
matchesm=re.findall(regsubm,string,re.M)
print matches[i],'--->',matchesm[0]
我是网络抓取的初学者,我对这个过程非常感兴趣。我为自己设定了一个项目,可以让我在完成项目之前保持动力。
我的项目
我的目标是编写一个 Python 程序,进入我的大学成绩页面并抓取一系列学生的所有成绩,并将他们在每个科目中的每个分数存储在 .csv 文件中,或者,分隔的文本文件。我已经获得了将 post 请求提交到 .asp 页面的代码。如果您能指导我如何将主题详细信息存储在单独的列中,我将不胜感激:
期望输出:
Sl.no,姓名,主题1,主题2,主题3,主题4,主题5,主题6,..等
1,杰森,8,9,8,8,8,9..等
2,彼得,6,8,9,8,7,7..等
.
。
.
一系列考试编号。
尝试一些示例数据
结果网站:http://result.pondiuni.edu.in/candidate.asp
注册号:15te1218
学位: BTHEE
考试:第二
谁能告诉我如何完成任务? 请指正我,如果你能指导我解决问题就太好了。
这可以用更简单的方式完成吗?
在下面的代码中,您可以看到我试图打印出学生的姓名,但它 return 是一个空集(不起作用)。而且我不希望它 return 将数据作为一组,因为该细节只出现一次。
我不知道如何从结果页面的 html table 中提取该学生的主题名称和相应的标记。需要一些帮助。
代码:
import requests
from bs4 import BeautifulSoup
import re
import csv
for x in xrange(44,47):
EXAMNO ='15te12'+str(x)
print EXAMNO
data = {"txtregno": EXAMNO,
"cmbdegree": r"BTHEE~\BTHEE\result.mdb", # use raw strings
"cmbexamno": "B",
"dpath": r"\BTHEE\result.mdb",
"dname": "BTHEE",
"txtexamno": "B"}
results_page = requests.post("http://result.pondiuni.edu.in/ResultDisp.asp", data=data).content
soup = BeautifulSoup(results_page, 'html.parser').prettify()
regpa= "<!--Percentage / S.G.P.A : <b>(.+?) </b> -->"
patterngpa =re.compile(regpa)
gpa=re.findall(patterngpa,soup)
print gpa
rename="<font size=3 color=black>(.+?)</font>"
patternname=re.compile(rename)
name=re.findall(patternname,soup)
print (name)
输出:
15te1244
[u'8.67']
15te1245
[u'8.8']
[]
15te1246
[u'7.8']
[]
如果你能告诉我如何以所需的输出格式打印它会很有帮助。
谢谢。
花了很多时间寻找暴力解决方案。
import requests
from bs4 import BeautifulSoup
import re
import csv
for x in xrange(44,47):
EXAMNO ='15te12'+str(x)
data = {"txtregno": EXAMNO,
"cmbdegree": r"BTHEE~\BTHEE\result.mdb", # use raw strings
"cmbexamno": "B",
"dpath": r"\BTHEE\result.mdb",
"dname": "BTHEE",
"txtexamno": "B"}
results_page = requests.post("http://result.pondiuni.edu.in/ResultDisp.asp", data=data).content
soup = BeautifulSoup(results_page, 'html.parser').prettify()
string=str(BeautifulSoup(results_page, 'html.parser'))
regpa= "<!--Percentage / S.G.P.A : <b>(.+?) </b> -->"
print (re.search(regpa,string,re.M|re.I )).group(1)
regname="<b>Name of the student : <b><font color=\"black\" size=\"3\">(.*)</font></b></b>"
print (re.search(regname,string,re.M|re.I )).group(1)
regsub="66%\"><font color=\"black\" face=\"arial\" size=\"2\">(.*)</font></td>"
matches=(re.findall(regsub,string,re.M|re.I ))
for i in xrange(len(matches)):
regsubm=">"+matches[i]+"</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"2%\"><font color=\"black\" face=\"arial\" size=\"2\">..</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"7%\"><font color=\"black\" face=\"arial\" size=\"2\">[\xc2]?[\xa0]?[\xc2]?[\xa0]?-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"1%\"><font color=\"black\" face=\"arial\" size=\"2\">-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"5%\"><font color=\"black\" face=\"arial\" size=\"2\">-</font></td>\n<td align=\"center\" bgcolor=\"white\" width=\"5%\"><font color=\"black\" face=\"arial\" size=\"2\">(.*)</font>"
matchesm=re.findall(regsubm,string,re.M)
print matches[i],'--->',matchesm[0]