【问题标题】:How to get the option text using BeautifulSoup如何使用 BeautifulSoup 获取选项文本
【发布时间】:2012-11-13 08:47:54
【问题描述】:

我想使用 BeautifulSoup 来获取以下 html 中的选项文本。例如:我想获得 2002/12 、 2003/12 等。

<select id="start_dateid">
<option value="0">2002/12</option>
<option value="1">2003/12</option>
<option value="2">2004/12</option>
<option value="3">2005/12</option>
<option value="4">2006/12</option>
<option value="5" selected="">2007/12</option>
<option value="6">2008/12</option>
<option value="7">2009/12</option>
<option value="8">2010/12</option>
<option value="9">2011/12</option>
</select>

获取内容的最佳方式是什么?现在我正在使用以下代码,但我不知道如何使用漂亮的汤。如果 html 文件中有多个选定区域,则结果将不正确。这是我目前所拥有的:

    import urllib2
    from bs4 import BeautifulSoup
    import lxml

    soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml");
    for item in soup.find_all('option'):
            print(''.join(str(item.find(text=True))));

【问题讨论】:

    标签: python html-parsing beautifulsoup


    【解决方案1】:

    您不必在此处使用lxml。我在我的机器上安装它时遇到问题,所以我的答案没有使用它。

    from bs4 import BeautifulSoup as BS
    import urllib2
    
    soup = BS(urllib2.urlopen("./test.html").read())
    contents = [str(x.text) for x in soup.find(id="start_dateid").find_all('option')]
    

    这样,您可以避免 html 文件中出现多个选择区域的问题,因为我们首先受到 id='start_dateid' 的限制,这保证您拥有正确的 &lt;select&gt;,因为在每个 html 文档中每个 html如果元素具有id 属性,则它必须具有唯一的id 属性。然后,我们只在 that &lt;select&gt; 标签内搜索所有&lt;option&gt; 标签,然后我们从每个&lt;option&gt; 中获取所有值。

    【讨论】:

      【解决方案2】:

      只需选择select 标记,然后遍历包含的字符串元素:

      import urllib2
      from bs4 import BeautifulSoup
      import lxml
      
      soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml");
      select = soup.find('select', id="start_dateid")
      for value in select.stripped_strings:
          print value
      

      一个小捷径;您可以改为循环 select.find_all('option') 并从每个属性中获取 .text 属性,但是由于无论如何都不存在其他元素,为什么不直接使用字符串 iterable 并完成它。毕竟,&lt;select&gt; 标签中只允许使用&lt;option&gt;&lt;optgroup&gt; 标签,并且只有&lt;option&gt; 标签包含文本。

      交互式解释器的输出:

      >>> select = soup.find('select', id="start_dateid")
      >>> for value in select.stripped_strings:
      ...     print value
      ... 
      2002/12
      2003/12
      2004/12
      2005/12
      2006/12
      2007/12
      2008/12
      2009/12
      2010/12
      2011/12
      

      如果你需要把它变成一个列表,只需使用:

      values = list(select.stripped_strings)
      

      【讨论】:

      • 如果&lt;select&gt; 中有非&lt;option&gt; 字段,stripped_strings 的答案可能会出现问题——它们也会出现在stripped_strings 迭代中。最好指定我们专门寻找 &lt;option&gt; 标签。
      • @jdotjdot:在select 中只允许使用optgroupoption 标签,您在select 中找到的唯一文本 是其中的文本option 标签。您还期待select 中的其他文本是什么?
      • 我不期待select 中的其他任何内容,只是从编写糟糕的网站多年的数据挖掘来看,我正在防范无效的 HTML。仅仅因为select不应该有任何其他内容并不意味着不会有。
      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2021-05-10
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多