Python 3.x Scraping Training.gov.au表格

Python 3.x Scraping Training.gov.au表格,python-3.x,csv,web-scraping,beautifulsoup,Python 3.x,Csv,Web Scraping,Beautifulsoup,我正在努力使我的一些工作自动化。 讨论中的网站是training.gov.au,它们在特定页面下嵌套表格,例如。 实际上,我想要做的是能够指出我想要使用的模块(在本例中为BSBWHS402),并迭代该页面上嵌套的特定表,然后将这些表重新加工成.csv格式,或者理想情况下,再加工成预格式化的.doc格式 我已经能够从代码中获得一些我需要的东西,通过屠杀其他工作,但不能让它看起来类似于表中的站点。 我曾尝试将其粘贴到.csv文件中并使用分隔符,但这不起作用,而且显然无法实现自动化 导入请求 从bs4

我正在努力使我的一些工作自动化。 讨论中的网站是training.gov.au,它们在特定页面下嵌套表格,例如。 实际上,我想要做的是能够指出我想要使用的模块(在本例中为BSBWHS402),并迭代该页面上嵌套的特定表,然后将这些表重新加工成.csv格式,或者理想情况下,再加工成预格式化的.doc格式

我已经能够从代码中获得一些我需要的东西,通过屠杀其他工作,但不能让它看起来类似于表中的站点。 我曾尝试将其粘贴到.csv文件中并使用分隔符,但这不起作用,而且显然无法实现自动化

导入请求
从bs4导入BeautifulSoup
作为pd进口熊猫
导入csv
网站\ url=请求。获取('https://training.gov.au/Training/Details/BSBWHS402)。文本
soup=BeautifulSoup(网站地址'lxml')
tables=soup.findAll('table')
My_table=soup.find('元素和性能标准')
df=pd.read_html(str(表))
结果=(df[8]。to_json(orient='records'))
打印(结果)
我得到下面的一行

[{“0”:“要素”,“1”:“绩效标准”},{“0”:“要素描述基本成果”,“1”:“绩效标准描述证明要素成就所需的绩效”。},{“0”:“1协助确定工作场所WHS的法律框架”,“1”:"1.1查阅与组织运营相关的WHS现行法律和相关文件\u2019s 1.2利用WHS法案、法规、实践规范、标准和指导材料之间关系的知识,协助确定工作场所的法律要求1.3协助确定和确认职责、要求和要求法规1.4中规定的hts和个人及各方的义务在必要时协助寻求法律顾问的建议“},{“0”:“2协助提供WHS合规性建议”,“1”:”2.1协助向个人和各方提供有关其法律职责、权利和义务的建议,以及WHS法规中相关信息的位置2.2协助向个人和各方提供有关WHS监管机构的职能和权力以及如何行使这些职能和权力的建议,以及WHS监管机构的目标和原则钉住WHS“},{“0”:“3协助WHS法规遵从性措施”,“1”:”3.1协助评估工作场所如何遵守相关WHS法规3.2协助确定个人和各方的WHS培训需求,并提供培训以满足法律和其他要求3.3协助制定和实施工作场所政策、程序、流程和系统的变更,这些变更将ieve合规“}]
我不知道该如何准确地使用它,但我至少可以注意到它已经给出了它应该位于哪个列的分配

对于如何使该产品更好的批评和想法非常开放。 我将为它创建一个UI来输入模块名,但这是future me的问题。 提前感谢

而不是

df[8].to_json
使用

你会得到你想要的

为了保留新行,您必须使用其他库,如
lxml
,而不是
pandas
,因为
pd.read\u html
规范了内容。 在github上查看

这是:

从bs4导入美化组
导入csv
网站\ url=请求。获取('https://training.gov.au/Training/Details/BSBWHS402)。文本
soup=BeautifulSoup(网站地址'lxml')
#字符串参数在Beauty Soup 4.4.0中是新的。
#在早期版本中,它被称为文本。
table=(soup.find(“h2”,string=“元素和性能标准”)。find_next(“table”)
输出_行=[]
对于table.findAll('tr')中的table_行:
columns=表\u行.findAll('td')
输出_行=[]
对于列中的列:
输出\行.追加(列.文本)
输出行。追加(输出行)
将open('output.csv','w')作为csvfile:
writer=csv.writer(csvfile)
writer.writerows(输出行)
csvfile.flush()

这样的输出到底有什么问题?它输出JSON格式。有一个行数组。尝试在任何JSON查看器中粘贴此字符串。例如,这里我不一定要JSON格式,这是我发现的工作方式。我不知道如何将它从JSON转换为.csv。此外,当我仔细查看时,它整理了一些所有1.1、1.2、1.3中的数据都在同一个数据集中。在网站上,这些是表格中的独立行。谢谢,请再做一件事来帮助放样。该行逐字打印
1.1访问与组织相关的WHS现行立法和相关文档™s运营1.2利用WHS法案、法规、实践规范、标准和指导材料之间关系的知识,协助确定工作场所的法律要求1.3协助确定和确认立法规定的个人和各方的职责、权利和义务
是否有如何分离1.1、1.2、1.3并纠正错误?我觉得我应该知道这一点,但是
html=open(“table.html”)。read()
这应该直接指向站点吗?我已经尝试将站点输入到“”而不是“table.html”中“但这不起作用。更新了示例以匹配您的应用程序,因此我以前遇到了一个问题。网站的构建使得标题“元素和性能标准”不是表的父级。因此,当我运行脚本时,它会启动
table=(soup.find('Elements and Performance criterias'))。find_next('table')AttributeError:'NoneType'对象没有属性'find_next'
1最后一件事请注意,我一直得到错误
TypeError:需要一个类似字节的对象,而不是'str'
,我一直试图自己断断续续地修复它,但你会发现我在兜圈子。谢谢
df[8].to_csv