基本的Python/Beautiful Soup解析

3 投票
2 回答
2142 浏览
提问于 2025-04-17 06:05

假设我使用了

date = r.find('abbr')

来获取

<abbr class="dtstart" title="2012-11-16T00:00:00-05:00">November 16, 2012</abbr>

我只想打印出 2012年11月16日,但是如果我尝试

print date.string

我得到的是

AttributeError: 'NoneType' object has no attribute 'string'

我哪里做错了?

更新:这是我的代码 没有一对打印语句能打印出原始字符串,但没有注释的那些能得到正确的标签

from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("some-url-path")
soup = BeautifulSoup(page)
calendar = soup.find('table',{"class" : "vcalendar ical"})
for r in calendar.findAll('tr'):
#   print ''.join(r.findAll('abbr',text=True))
#   print ''.join(r.findAll('strong',text=True))
    print r.find('abbr')
    print r.find('strong')

2 个回答

0

这个错误信息的意思是 date 的值是 None,也就是没有值。你提供的代码不够多,所以我们无法判断为什么会这样。实际上,如果按照你发的代码最简单的方式来使用,应该是可以正常工作的:

import BeautifulSoup

content='<abbr class="dtstart" title="2012-11-16T00:00:00-05:00">November 16, 2012</abbr>'
r=BeautifulSoup.BeautifulSoup(content)
date=r.find('abbr')
print(date.string)
# November 16, 2012
3

soup.find('abbr').string 这个写法应该没问题。可能是 date 这部分出了点问题。

from BeautifulSoup import BeautifulSoup

doc = '<abbr class="dtstart" title="2012-11-16T00:00:00-05:00">November 16, 2012</abbr>'

soup = BeautifulSoup(doc)

for abbr in soup.findAll('abbr'):
    print abbr.string

结果:

November 16, 2012

根据问题中添加的代码更新:

你不能那样使用 text 这个参数。

http://www.crummy.com/software/BeautifulSoup/documentation.html#arg-text

text 是一个参数,它让你可以搜索 NavigableString 对象,而不是标签。

你要么是在找文本节点,要么是在找标签。文本节点是没有标签名的。

也许你想用 ''.join([el.string for el in r.findAll('strong')]) 这个方法?

撰写回答