如何使用 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 对象)并尝试过:

显示了相关 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)。