首页 > 解决方案 > 如何从 BeautifulSoup scrape 中提取 onclick 事件 Javascript 文本,然后与 Selenium execute_script 一起使用?

问题描述

我正在与一个内部网站合作,并使用 Selenium 和 Beautifulsoup 为多名员工提取工资单。我首先使用 Selenium 打开站点,运行快速 javascript 以生成结果表,然后使用 BeautifulSoup 根据支付金额查找我需要查看的特定存根。

生成的表包含每个 paystub 的链接,其中包含生成 javascript 命令列表的“onclick”事件。没有其他方法可以识别每个 paystub 的超链接,所以我专注于查找我需要运行的 onclick javascript 以找到正确的 paystub。

总之,我只需要从下面使用 BeautifulSoup 检索的 payhref 变量中提取 13 个不同的 jv 命令。然后我可以使用 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')

onclicktext 返回:

"document.frmInitial.hidSSN.value='000000000';\n    \t\t\t\t\t\t        document.frmInitial.hidCompany.value='01';\n    \t\t\t\t\t\t        document.frmInitial.hidUSERID.value='XXXXXXX';\n    \t\t\t\t\t\t        document.frmInitial.hidInsertID.value='XXXXXXX';\n    \t\t\t\t\t\t        document.frmInitial.hidPeriodEndDate.value='2019-08-17';\n    \t\t\t\t\t\t        document.frmInitial.hidICC.value='4090';\n    \t\t\t\t\t\t        document.frmInitial.hidStation.value='132';\n    \t\t\t\t\t\t        document.frmInitial.hidDraftNumber.value='00004806';\n    \t\t\t\t\t\t        document.frmInitial.hidManualType.value='H';\n    \t\t\t\t\t\t        document.frmInitial.hidRate.value='.0000';\n    \t\t\t\t\t\t        document.frmInitial.hidReportingDate.value='2019-08-20';\n    \t\t\t\t\t\t        document.frmInitial.hidActionCode.value='2';\n    \t\t\t\t\t\t        document.frmInitial.hidReturnCode.value='0';\n    \t\t\t                    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)')

我确信有一种更 Pythonic 的方法可以做到这一点,但使用 .get('onclick') 肯定是我所缺少的。

标签: python-3.xseleniumbeautifulsoupselenium-chromedriver

解决方案


要访问 HTML 标签中的元素,您可以使用 bs4 中的 .get() 方法。

onclicktext = payhref.get('onclick')

此变量将包含“onclick”元素中的所有内容。


推荐阅读