如何使用BeautifulSoup获取选项文本

时间:2012-11-25 20:42:28

标签: python html-parsing beautifulsoup

我想使用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))));

2 个答案:

答案 0 :(得分:14)

您不必在此使用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',这可以保证你拥有正确的<select>,因为html文档如果每个html元素具有id属性,则必须具有唯一的id属性。然后,我们只在 <option>标记内搜索所有<select>标记,然后我们从每个<option>获取所有值。< / p>

答案 1 :(得分: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获取<option>属性,但由于无论如何都不存在其他元素,为什么不直接进行字符串迭代并完成它。毕竟,<optgroup>标记中只允许<select><option>个标记,只有>>> 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)

如果您需要将其转换为列表,只需使用:

{{1}}