使用Beautiful Soup获取<li>标签中的数据
在一个无序列表(ul)里,有三个列表项(li)。但是,Beautiful Soup没有显示这些列表项里的文字。 这三个列表项分别包含了一个机构的位置、电话号码和传真号码。
<ul>
<li class="spacer">
<span>
Location:
</span>
<br></br>
1500 S. 1st Avenue
<br></br>
Yuma, AZ 85364
</li>
<li class="spacer">
<span>
Phone Number:
</span>
<br></br>
928-373-4700
</li>
<li class="spacer">
<span>
Fax Number:
</span>
<br></br>
928-343-8864
</li>
我的脚本是:
import urllib2
from bs4 import BeautifulSoup
url = "http://www.policelocator.com/az/yuma-police-department/"
text = urllib2.urlopen(url).read()
soup = BeautifulSoup(text)
data = soup.findAll('li',attrs={'class':'spacer'})
print data[0]
输出结果是:
<li class="spacer"><span>Location:</span> </li>
我可以找到特定的列表项,但里面没有位置信息。不知道为什么这个信息被省略了。
任何帮助都非常感谢。
2 个回答
0
我不太确定你用的BeautifulSoup是什么版本。在我这台装有BeautifulSoup4.3.2和Python 2.7的机器上,输出结果是:
<li class="spacer"><span>地点:</span> 1500 S. 1st AvenueYuma, AZ 85364</li>
2
这段话不是在讲BeautifulSoup
的版本问题,而是关于它使用的不同解析器之间的区别。你可以在这里查看这些解析器的具体差异:解析器之间的差异。
Beautiful Soup给不同的解析器提供了相同的操作界面,但每个解析器的工作方式都不一样。不同的解析器会从同一个文档中生成不同的解析树。
举个例子:
>>> soup = BeautifulSoup(text, 'html.parser')
>>> print soup.find('li', attrs={'class': 'spacer'})
<li class="spacer"><span>Location:</span> </li>
>>> soup = BeautifulSoup(text, 'html5lib')
>>> print soup.find('li', attrs={'class': 'spacer'})
<li class="spacer"><span>Location:</span> <br/>1500 S. 1st Avenue<br/>Yuma, AZ 85364</li>
>>> soup = BeautifulSoup(text, 'lxml')
>>> print soup.find('li', attrs={'class': 'spacer'})
<li class="spacer"><span>Location:</span> 1500 S. 1st AvenueYuma, AZ 85364</li>
正如你所看到的,不同的解析器会产生不同的结果。
如果你没有明确指定使用哪个解析器,BeautifulSoup
会自动选择一个最合适的解析器:
如果你什么都不指定,你会得到安装的最佳HTML解析器。Beautiful Soup认为lxml的解析器是最好的,其次是html5lib的,然后是Python自带的解析器。