搜索<b>标签,返回无</b>

时间:2014-06-06 12:32:29

标签: python beautifulsoup

有趣的是BeautifulSoup如何找不到b标签。这是HTML:

<div id="data_2014-06-12" class="dates">

    <b>

        Ketvirtadienis, birželio 12 d.

    </b>

</div>

这是我的代码:

date = soup.findAll("div", attrs={"class": "dates"})
for i in date:
    print i.find('b')

这是输出:

None

我已经搜索了同样问题的主题,但我找不到正确的答案,为什么这段代码没有返回。

编辑:

这是我的完整代码:

from collections import namedtuple
url ="http://www.eurofootball.lt/tvarkarastis"
r = requests.get(url)
soup = BeautifulSoup(r.content)
date = soup.findAll("div", attrs={"class": "dates"})
for i in date:
    print i.find('b')

这是完整的div:

div id =&#34; data_2014-06-12&#34;类=&#34;日期&#34;&GT;

<b>

    Ketvirtadienis, birželio 12 d.

</b>
<ul></ul>

2 个答案:

答案 0 :(得分:1)

<强>更新 验证原始HTML会导致错误,可能导致您观察到的问题:Error Line 573, Column 79: End tag b violates nesting rules. …-12">Ketvirtadienis, birželio 12 d.</b><ul><li class="match_row match_row_leag…

顺便说一句,用于网站验证的规范工具是W3C验证器。 http://validator.w3.org/check?uri=http%3A%2F%2Fwww.eurofootball.lt%2Ftvarkarastis&charset=%28detect+automatically%29&doctype=Inline&group=0

您的代码在工作中,给出有效的HTML输入。这是一个完整的最小例子:

文件data中的HTML源代码:

$ cat data
<div id="data_2014-06-12" class="dates">
   <b>Ketvirtadienis, birželio 12 d.</b>
</div>

Python测试脚本:

$ cat test.py 
from bs4 import BeautifulSoup
html = open("data").read().decode("utf-8")
soup = BeautifulSoup(html)
dates = soup.findAll("div", attrs={"class": "dates"})
for i in dates:
    print i.find('b')

执行:

$ python test.py 
<b>Ketvirtadienis, birželio 12 d.</b>

我相信如果你曾尝试为你的案例展示一个完整的最小例子,你就会发现你的问题。

答案 1 :(得分:0)

您正在尝试加载broken HTML; HTML解析器如何修复它并不是由任何标准定义的,因此取决于您使用的确切解析器。

BeautifulSoup支持different parsers,每个人都会尽力修复HTML:

>>> import requests
>>> from bs4 import BeautifulSoup
>>> html = requests.get("http://www.eurofootball.lt/tvarkarastis").content
>>> [div.b for div in BeautifulSoup(html, 'html.parser').select('div.dates')]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> [div.b for div in BeautifulSoup(html, 'lxml').select('div.dates')]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> [div.b for div in BeautifulSoup(html, 'html5lib').select('div.dates')]
[<b>Ketvirtadienis, birželio 12 d.</b>]

只有html5lib解析器找到一个匹配的粗体标记;其他两个解析器完全省略了损坏的<b>标记。

这是因为<div>标记内的<b>标记未关闭:

<b><div class="dates" id="data_2014-06-26">Ketvirtadienis, birželio 26 d.</b>

根据您使用的解析器,只需完全忽略<b>标记; html.parserlxml选项会将<b>标记视为标记:

>>> [div.parent.name for div in BeautifulSoup(html, 'html.parser').select('div.dates')]
[u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b', u'b']

您可以直接从<div>抓取文字:

>>> [div.string for div in BeautifulSoup(html, 'html.parser').select('div.dates')]
[u'Ketvirtadienis, bir\u017eelio 12 d.', u'Penktadienis, bir\u017eelio 13 d.', u'\u0160e\u0161tadienis, bir\u017eelio 14 d.', u'Sekmadienis, bir\u017eelio 15 d.', u'Pirmadienis, bir\u017eelio 16 d.', u'Antradienis, bir\u017eelio 17 d.', u'Tre\u010diadienis, bir\u017eelio 18 d.', u'Ketvirtadienis, bir\u017eelio 19 d.', u'Penktadienis, bir\u017eelio 20 d.', u'\u0160e\u0161tadienis, bir\u017eelio 21 d.', u'Sekmadienis, bir\u017eelio 22 d.', u'Pirmadienis, bir\u017eelio 23 d.', u'Antradienis, bir\u017eelio 24 d.', u'Tre\u010diadienis, bir\u017eelio 25 d.', u'Ketvirtadienis, bir\u017eelio 26 d.']