7

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

2 回答 2

16

你不必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 文件中的多个选择区域的问题,因为我们首先限制 by id='start_dateid',这保证您拥有正确的<select>,因为在每个 html 文档中,每个 html 元素必须具有唯一的id属性,如果它有一个id属性。然后,我们<option>只在 <select>标签内搜索所有标签,然后我们从每个标签中获取所有值<option>

于 2012-11-25T20:48:20.363 回答
4

只需选择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 并完成它。毕竟,标签中只允许使用<option>and标签,并且只有标签包含文本。<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)
于 2012-11-25T20:50:02.170 回答