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