Python 在动态HTML网站上使用Beautiful Soup进行web抓取的问题
我尝试使用Beautiful Soup刮取一系列HTML文件,但是我得到了一些非常奇怪的结果,我认为这是因为查询是动态的,我对web刮取不是很有经验。如果你看一下这个网站,在这种情况下,我所要做的就是获取工作类型的所有信息,但我的结果与我希望的相差甚远。请参阅下面我的代码(感谢大家): 谢谢你的帮助。我想我会分享下面的代码,注意我使用了很多其他帖子的参考资料。没有@Andrej Kesely是不可能的Python 在动态HTML网站上使用Beautiful Soup进行web抓取的问题,python,beautifulsoup,Python,Beautifulsoup,我尝试使用Beautiful Soup刮取一系列HTML文件,但是我得到了一些非常奇怪的结果,我认为这是因为查询是动态的,我对web刮取不是很有经验。如果你看一下这个网站,在这种情况下,我所要做的就是获取工作类型的所有信息,但我的结果与我希望的相差甚远。请参阅下面我的代码(感谢大家): 谢谢你的帮助。我想我会分享下面的代码,注意我使用了很多其他帖子的参考资料。没有@Andrej Kesely是不可能的 url = "https://www.acc.co.nz/for-providers/tr
url = "https://www.acc.co.nz/for-providers/treatment-recovery/work-type-detail-sheets/getSheets"
import requests
import json
from pandas.io.json import json_normalize
headers = {'X-Requested-With': 'XMLHttpRequest'}
r = requests.get(url, headers=headers)
data = json.loads(r.text)
result = json_normalize(data)
result = result[['ANZSCO','Comments','Description','Group',
'EntryRequirements','JobTitle','PhysicalMentalDemands',
'WorkEnvironment','WorkTasks']]
##Lets start cleaning up the data set
from html.parser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.strict = False
self.convert_charrefs= True
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
list = ['WorkTasks', 'PhysicalMentalDemands','WorkTasks','Description']
for i in list:
result[i] = result[i].apply(lambda x: strip_tags(x))
list2 = ['Comments','EntryRequirements','WorkEnvironment']
for i in list2:
result[i] = result[i].fillna('not_available')
result[i] = result[i].apply(lambda x: strip_tags(x))
页面是通过Ajax动态加载的。查看network inspector,该页面将从位于的非常大的JSON文件加载所有数据。要加载所有作业数据,可以使用以下脚本:
url = "https://www.acc.co.nz/for-providers/treatment-recovery/work-type-detail-sheets/getSheets"
import requests
import json
headers = {'X-Requested-With': 'XMLHttpRequest'}
r = requests.get(url, headers=headers)
data = json.loads(r.text)
# For printing all data in pretty form uncoment this line:
# print(json.dumps(data, indent=4, sort_keys=True))
for d in data:
print(f'ID:\t{d["ID"]}')
print(f'Job Title:\t{d["JobTitle"]}')
print(f'Created:\t{d["Created"]}')
print('*' * 80)
# Available keys in this JSON:
# ClassName
# LastEdited
# Created
# ANZSCO
# JobTitle
# Description
# WorkTasks
# WorkEnvironment
# PhysicalMentalDemands
# Comments
# EntryRequirements
# Group
# ID
# RecordClassName
这张照片是:
ID: 2327
Job Title: Watch and Clock Maker and Repairer
Created: 2017-07-11 11:33:52
********************************************************************************
ID: 2328
Job Title: Web Administrator
Created: 2017-07-11 11:33:52
********************************************************************************
ID: 2329
Job Title: Welder
Created: 2017-07-11 11:33:52
...and so on
在脚本中,我编写了可用于访问特定作业数据的可用键。该页面通过Ajax动态加载。查看network inspector,该页面将从位于的非常大的JSON文件加载所有数据。要加载所有作业数据,可以使用以下脚本:
url = "https://www.acc.co.nz/for-providers/treatment-recovery/work-type-detail-sheets/getSheets"
import requests
import json
headers = {'X-Requested-With': 'XMLHttpRequest'}
r = requests.get(url, headers=headers)
data = json.loads(r.text)
# For printing all data in pretty form uncoment this line:
# print(json.dumps(data, indent=4, sort_keys=True))
for d in data:
print(f'ID:\t{d["ID"]}')
print(f'Job Title:\t{d["JobTitle"]}')
print(f'Created:\t{d["Created"]}')
print('*' * 80)
# Available keys in this JSON:
# ClassName
# LastEdited
# Created
# ANZSCO
# JobTitle
# Description
# WorkTasks
# WorkEnvironment
# PhysicalMentalDemands
# Comments
# EntryRequirements
# Group
# ID
# RecordClassName
这张照片是:
ID: 2327
Job Title: Watch and Clock Maker and Repairer
Created: 2017-07-11 11:33:52
********************************************************************************
ID: 2328
Job Title: Web Administrator
Created: 2017-07-11 11:33:52
********************************************************************************
ID: 2329
Job Title: Welder
Created: 2017-07-11 11:33:52
...and so on
在我编写的脚本中,您可以使用可用密钥访问特定的工作数据。查看Selenium查看Selenium@AndreiKesely,你能给我指一个包把数据放在数据框格式吗?我尝试使用json_normalize,但很多html都会传递变量,例如:•相关的三级资格或至少五年的适用经验(ANZSCO技能等级1)。在某些情况下,可能需要特定的经验和/或在职培训。@Ian_De_Oliveira我不使用数据帧/熊猫,因此我无法在这方面为您提供太多帮助。但是试着从数据中去掉标签,例如Kasely,再次感谢。我以前查看过neat函数,但在字段注释、工作环境和EntryRequirements上都失败了。我仍然在努力。我设法找到了问题,我已经分享了我上面的全部代码。没有你整洁的方法是不可能的。Tks@AndreiKesely,你能给我指一个包把数据放在数据框格式吗?我尝试使用json_normalize,但很多html都会传递变量,例如:•相关的三级资格或至少五年的适用经验(ANZSCO技能等级1)。在某些情况下,可能需要特定的经验和/或在职培训。@Ian_De_Oliveira我不使用数据帧/熊猫,因此我无法在这方面为您提供太多帮助。但是试着从数据中去掉标签,例如Kasely,再次感谢。我以前查看过neat函数,但在字段注释、工作环境和EntryRequirements上都失败了。我仍然在努力。我设法找到了问题,我已经分享了我上面的全部代码。没有你整洁的方法是不可能的。Tks