如何使用BeautifulSoup / MechanicalSoup生成span标记的子项 - 选择下拉字段值

问题描述 投票:0回答:1

我正在尝试使用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对象)并尝试过:

  • 使用MechanicalSoup的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-3.x web-scraping beautifulsoup mechanicalsoup
1个回答
0
投票

对我来说,你的代码通常看起来很好!当我在你引用的HTML上运行你的python片段时,它不会引发InvalidFormMethod异常。但是,当我在你提供的URL上运行它时,我确实看到了这个错误(因为,查看源HTML,没有名称为start_day的元素)。

我怀疑这是因为一个特定的JavaScript动作正在生成包含start_day字段的HTML。这是由具有onsubmit属性且没有action的表单暗示,以及包含许多JavaScript文件(可能需要或可能不需要与表单交互)。根据您对此表单的确切要求,您可能需要使用支持JavaScript的工具,例如Selenium(MechanicalSoup不会 - 请参阅this FAQ)。

© www.soinside.com 2019 - 2024. All rights reserved.