我正在与一个内部网站合作,并使用Selenium和Beautifulsoup为多个员工提取工资单。我首先使用Selenium打开网站,运行一个快速的javascript来生成结果表,然后使用BeautifulSoup根据工资金额找到我需要审查的特定存根。
生成的表包括每个工资单的链接,其中包含生成 javascript 命令列表的"onclick"事件。没有其他方法可以识别每个工资单的超链接,所以我专注于查找我需要运行的 onclick javascript 来找到正确的工资单。
总之,我只需要从下面的 payhref 变量中提取 13 个不同的 jv 命令,我使用 BeautifulSoup 检索这些命令。然后我可以使用Selenium execute_script运行该脚本。但是,我似乎无法从 payhref 逻辑中提取该文本。
empid = 000000000
conum= 01
driver.get('http://www.website.com/hrs/payroll/checks/pay_summary.asp')
javascript = "document.querySelector('#txtFromDate').value = '12/1/2019'; document.querySelector('#spanFormletContentsFormletInput > table > tbody > tr > td > table > tbody > tr.alignTextCenter > td.alignTextCenter > input').click();" % (conum, empid)
driver.execute_script(javascript)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
paylink= soup.find(string="541.80")
paylink_parent = paylinks.find_parent("tr")
payhref = paylink_parent.find('a')
然后 payhref 返回以下 HTML:
<a href="/" onclick="document.frmInitial.hidSSN.value='000000000';
document.frmInitial.hidCompany.value='01';
document.frmInitial.hidUSERID.value='XXXXXXX';
document.frmInitial.hidInsertID.value='XXXXXX';
document.frmInitial.hidPeriodEndDate.value='2019-08-17';
document.frmInitial.hidICC.value='4090';
document.frmInitial.hidStation.value='132';
document.frmInitial.hidDraftNumber.value='00004806';
document.frmInitial.hidManualType.value='H';
document.frmInitial.hidRate.value='.0000';
document.frmInitial.hidReportingDate.value='2019-08-20';
document.frmInitial.hidActionCode.value='2';
document.frmInitial.hidReturnCode.value='0';
this.href='javascript:submitForm(2)'">
132</a>
我需要从 payhref 中提取什么:
document.frmInitial.hidSSN.value='000000000';
document.frmInitial.hidCompany.value='01';
document.frmInitial.hidUSERID.value='XXXXXXX';
document.frmInitial.hidInsertID.value='XXXXXX';
document.frmInitial.hidPeriodEndDate.value='2019-08-17';
document.frmInitial.hidICC.value='4090';
document.frmInitial.hidStation.value='132';
document.frmInitial.hidDraftNumber.value='00004806';
document.frmInitial.hidManualType.value='H';
document.frmInitial.hidRate.value='.0000';
document.frmInitial.hidReportingDate.value='2019-08-20';
document.frmInitial.hidActionCode.value='2';
document.frmInitial.hidReturnCode.value='0';
更新的解决方案
onclicktext = payhref.get('onclick')
点击文本返回:
"document.frmInitial.hidSSN.value='000000000';n tttttt document.frmInitial.hidCompany.value='01';n tttttt document.frmInitial.hidUSERID.value='XXXXXXX';n tttttt document.frmInitial.hidInsertID.value='XXXXXXX';n tttttt document.frmInitial.hidPeriodEndDate.value='2019-08-17';n tttttt document.frmInitial.hidICC.value='4090';n tttttt document.frmInitial.hidStation.value='132';n tttttt document.frmInitial.hidDraftNumber.value='00004806';n tttttt document.frmInitial.hidManualType.value='H';n tttttt document.frmInitial.hidRate.value='.0000';n tttttt document.frmInitial.hidReportingDate.value='2019-08-20';n tttttt document.frmInitial.hidActionCode.value='2';n tttttt document.frmInitial.hidReturnCode.value='0';n ttt this.href='javascript:submitForm(2)'"
然后,我重新格式化了onclicktext,使其可以通过Selenium的execute_script执行:
onclicktext = onclicktext.replace('n','')
onclicktext = onclicktext.replace('t','')
onclicktext = onclicktext.replace("this.href='javascript:submitForm(2)'",'')
driver.execute_script(onclicktext)
driver.execute_script('submitForm(2)')
我确信有一种更 Python 的方法可以做到这一点,但使用 .get('onclick'( 肯定是我所缺少的。
要访问 HTML 标记中的元素,您可以使用 bs4 中的 .get(( 方法。
onclicktext = payhref.get('onclick')
此变量将包含"onclick"元素中的所有内容。
获得链接后,只需使用属性值onclick
,然后拆分并排除最后一项
payhref = paylink_parent.find('a')
for item in payhref['onclick'].split(';')[:-1]:
print(item.strip() +";")