【问题标题】:get data within <li> tag beautiful soup获取 <li> 标签内的数据 美丽的汤
【发布时间】:2014-10-16 23:05:48
【问题描述】:

一个 ul 中有 3 个 li 元素。美丽的汤没有显示 li 元素中的文本。 3 li 元素包含一个机构的位置、电话号码和传真号码。

<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>

我可以访问特定的 li 元素,但没有位置数据。由于某种原因,它被省略了。

任何帮助将不胜感激。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    这与BeautifulSoup 的版本无关——它与differences between underlying parsers 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 will choose the best one:

    如果您不指定任何内容,您将获得最好的 HTML 解析器 安装。 Beautiful Soup 将 lxml 的解析器评为最佳,然后 html5lib 的,然后是 Python 的内置解析器。

    【讨论】:

    • 我猜你是对的。如果我使用“html.parser”以外的解析器,我的 Windows 机器会出现错误。在我的 ubuntu 机器上,输出看起来很好,“html5lib”也可以正常工作。
    【解决方案2】:

    我不确定您使用的 BeautifulSoup 版本。在我的带有 BeautifulSoup4.3.2 和 Py2.7 的机器上,输出是

    &lt;li class="spacer"&gt;&lt;span&gt;Location:&lt;/span&gt; 1500 S. 1st AvenueYuma, AZ 85364&lt;/li&gt;

    【讨论】:

    • 我正在使用 Python 2.7.6 和 BeautifulSoup4。如何找到具体的 BS 版本?
    • 我的系统上还有 BS 4.3.2。你能建议问题出在哪里吗?
    • 我只是复制了您的代码并获得了带有位置数据的输出。您可以检查 url 返回的原始内容以查找是否有这些位置数据。
    • 问题与版本无关 - 它与解析器有关。
    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多