如何使用 BeautifulSoup/MechanicalSoup 生成 span 标记的子项 - 选择下拉字段值
How to yield children of span tag using BeautifulSoup/MechanicalSoup - selecting drop-down field values
我正在尝试使用 MechanicalSoup 在网页(http://supermag.jhuapl.edu/mag/?)上完成表单提交。在提交之前,必须在同一表格中使用下拉框指定开始日期、月份、年份、时间等日期。这可以使用 set_select()
MechanicalSoup 函数来完成,但我似乎无法访问每个字段的相关 select
标记。一个小小的免责声明;虽然我有科学编程经验,但我对 HTML 和上面提到的 Python 库还是陌生的。
虽然我不确定哪个库最适合 selecting 日期,但我似乎无法访问相关的 select
标签,它是相应 span
的子元素表单中的标签,具有名称属性,例如 'start_day'、'start_month'。
我同时拥有 mechanicalsoup.Form(form)
和 mechanicalsoup.StatefulBrowser(*args, **kwargs)
对象(后者对应于 bs4.BeautifulSoup
对象)并尝试过:
- 使用 MechanicalSoup 的
set_select
设置 select
标签
- 找到相关的
span
标签并使用 BeautifulSoup 访问下面的元素(特别是 select
标签),目的是通过更改URL (?)
显示了相关 HTML 的片段;请注意 div
标签和后续的 select
标签作为子标签。
表单标签:
<form name="theForm" class="form-horizontal" onsubmit="return false;">
表单中的相关跨度和 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 find()
尝试中列出 select
标签,或者让 mechanicalsoup set_select()
在调用时访问和设置给定的 select
标签在正确的表格上。
在 BeautifulSoup HTML 中找到了 span
标签,但在源 [=65] 中似乎没有任何子 select
标签=],并且对于 selecting 日期是必需的。调用 set_select()
returns 报错说找不到标签。
提前谢谢你;这是我在 Whosebug 上的第一个问题,我希望它能很好地满足指南!
对我来说,您的代码总体上看起来不错!当我 运行 您在此处引用的 HTML 上的 python 片段时,它不会引发 InvalidFormMethod
异常。但是,当我在你提供的 URL 上 运行 时,我确实看到了那个错误(因为,查看源 HTML,没有名称为 start_day
的元素).
我怀疑这是因为特定的 JavaScript 操作正在生成包含 start_day
字段的 HTML。具有 onsubmit
属性但没有 action
的表单以及包含许多 JavaScript 文件(与表单交互可能需要也可能不需要)暗示了这一点.根据您想要使用此表单执行的具体操作,您可能需要使用支持 JavaScript 的工具,例如 Selenium(MechanicalSoup 不支持 - 请参阅 this FAQ)。
我正在尝试使用 MechanicalSoup 在网页(http://supermag.jhuapl.edu/mag/?)上完成表单提交。在提交之前,必须在同一表格中使用下拉框指定开始日期、月份、年份、时间等日期。这可以使用 set_select()
MechanicalSoup 函数来完成,但我似乎无法访问每个字段的相关 select
标记。一个小小的免责声明;虽然我有科学编程经验,但我对 HTML 和上面提到的 Python 库还是陌生的。
虽然我不确定哪个库最适合 selecting 日期,但我似乎无法访问相关的 select
标签,它是相应 span
的子元素表单中的标签,具有名称属性,例如 'start_day'、'start_month'。
我同时拥有 mechanicalsoup.Form(form)
和 mechanicalsoup.StatefulBrowser(*args, **kwargs)
对象(后者对应于 bs4.BeautifulSoup
对象)并尝试过:
- 使用 MechanicalSoup 的
set_select
设置 - 找到相关的
span
标签并使用 BeautifulSoup 访问下面的元素(特别是select
标签),目的是通过更改URL (?)
select
标签
显示了相关 HTML 的片段;请注意 div
标签和后续的 select
标签作为子标签。
表单标签:
<form name="theForm" class="form-horizontal" onsubmit="return false;">
表单中的相关跨度和 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 find()
尝试中列出 select
标签,或者让 mechanicalsoup set_select()
在调用时访问和设置给定的 select
标签在正确的表格上。
在 BeautifulSoup HTML 中找到了 span
标签,但在源 [=65] 中似乎没有任何子 select
标签=],并且对于 selecting 日期是必需的。调用 set_select()
returns 报错说找不到标签。
提前谢谢你;这是我在 Whosebug 上的第一个问题,我希望它能很好地满足指南!
对我来说,您的代码总体上看起来不错!当我 运行 您在此处引用的 HTML 上的 python 片段时,它不会引发 InvalidFormMethod
异常。但是,当我在你提供的 URL 上 运行 时,我确实看到了那个错误(因为,查看源 HTML,没有名称为 start_day
的元素).
我怀疑这是因为特定的 JavaScript 操作正在生成包含 start_day
字段的 HTML。具有 onsubmit
属性但没有 action
的表单以及包含许多 JavaScript 文件(与表单交互可能需要也可能不需要)暗示了这一点.根据您想要使用此表单执行的具体操作,您可能需要使用支持 JavaScript 的工具,例如 Selenium(MechanicalSoup 不支持 - 请参阅 this FAQ)。