使用Beautiful Soup获取<li>标签中的数据

1 投票
2 回答
11509 浏览
提问于 2025-04-18 18:15

在一个无序列表(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自带的解析器。

撰写回答