我正在尝试使用MechanicalSoup在网页(http://supermag.jhuapl.edu/mag/?)上完成表单提交。在提交之前,必须在同一表格中指定日期,使用下拉框表示开始日期,月份,年份,时间等。这可以通过set_select()
MechanicalSoup功能完成,但我似乎无法访问相关的select
标签对于每个领域。一个小小的免责声明;虽然我有科学编程经验,但我不熟悉HTML和上面提到的Python库。
虽然我不确定哪个库最适合用于选择日期,但我似乎无法访问相关的select
标记,该标记是表单中相应span
标记的子元素,具有名称属性,例如'start_day','start_month'。
我有mechanicalsoup.Form(form)
和mechanicalsoup.StatefulBrowser(*args, **kwargs)
对象(后者对应于bs4.BeautifulSoup
对象)并尝试过:
select
设置set_select
标签span
标签并使用BeautifulSoup访问下面的元素(特别是select
标签),目的是以某种方式通过更改URL(?)来选择值显示了相关HTML的片段;请注意div
标签和随后的select
标签作为孩子。
表格标签:
<form name="theForm" class="form-horizontal" onsubmit="return false;">
表单中的相关span和select标签:
<span name="start_time">
<div>
<select name="start_day">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>...
</select>
<select style="width: 4em;" name="start_month">
<option value="1">January</option>
<option...
</select>
</div>
</span>
代码如下:
# Opening browser and URL
url = "http://supermag.jhuapl.edu/mag/?"
browser = ms.StatefulBrowser()
browser.open(url)
# Assigning bs4.BeautifulSoup object
html = browser.get_current_page()
# Assigning relevant form
form = browser.select_form('form[name="theForm"]')
# Assign correct span tag for e.g start_time
start_time_span = html.find_all('span')[2]
# Attempt to set start day value - returns
# 'InvalidFormMethod: No select named start_day'
form.set_select({'start_day': 1})
# Attempt to find select tags with bs4
html.find('select', {'start_day': 1})
start_time_span.find('select', {'start_day': 1})
# and eg looking for contents returns empty list
start_time_span.contents
我希望在bs4 select
尝试中列出find()
标签,或者在正确的表格上调用时,机械汤set_select()
可以访问和设置给定的select
标签。
span
标记位于BeautifulSoup HTML中,但似乎没有源HTML中存在的任何子select
标记,并且是选择日期所必需的。调用set_select()
会返回错误消息,指出无法找到该标记。
先感谢您;这是我在StackOverflow上的第一个问题,我希望它能够很好地满足指南!
对我来说,你的代码通常看起来很好!当我在你引用的HTML上运行你的python片段时,它不会引发InvalidFormMethod
异常。但是,当我在你提供的URL上运行它时,我确实看到了这个错误(因为,查看源HTML,没有名称为start_day
的元素)。
我怀疑这是因为一个特定的JavaScript动作正在生成包含start_day
字段的HTML。这是由具有onsubmit
属性且没有action
的表单暗示,以及包含许多JavaScript文件(可能需要或可能不需要与表单交互)。根据您对此表单的确切要求,您可能需要使用支持JavaScript的工具,例如Selenium(MechanicalSoup不会 - 请参阅this FAQ)。