Python:AttributeError:“NoneType”对象没有属性“findNext”

2024-05-14 20:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图刮一个网站与美化组,但有一个问题。 我正在学习python 2.7中的一个教程,其中的代码完全相同,没有问题。

import urllib.request
from bs4 import *


htmlfile = urllib.request.urlopen("http://en.wikipedia.org/wiki/Steve_Jobs")

htmltext = htmlfile.read()

soup = BeautifulSoup(htmltext)
title = (soup.title.text)

body = soup.find("Born").findNext('td')
print (body.text)

如果我试着运行我得到的程序

Traceback (most recent call last):
  File "C:\Users\USER\Documents\Python Programs\World Population.py", line 13, in <module>
    body = soup.find("Born").findNext('p')
AttributeError: 'NoneType' object has no attribute 'findNext'

这是python 3的问题还是我太天真了?


Tags: textimporttitle网站requestbody教程find
2条回答

find方法查找标记,而不是文本。要查找名称、生日和出生地,您必须查找具有相应类名的span元素,并访问该项的text属性:

import urllib.request
from bs4 import *


soup = BeautifulSoup(urllib.request.urlopen("http://en.wikipedia.org/wiki/Steve_Jobs"))
title = soup.title.text
name = soup.find('span', {'class': 'nickname'}).text
bday = soup.find('span', {'class': 'bday'}).text
birthplace = soup.find('span', {'class': 'birthplace'}).text

print(name)
print(bday)
print(birthplace)

输出:

Steven Paul Jobs
1955-02-24
San Francisco, California, US

注意:您不必对urlopen调用read,BS接受类似文件的对象。

findfind_all方法不搜索文档中的任意文本,而是搜索HTML标记。文档说明了这一点(我的斜体字):


输入name的值,您将告诉beautifuldsoup只考虑带有特定名称的标记。文本字符串将被忽略,名称不匹配的标记也将被忽略。这是最简单的用法:

soup.find_all("title")
# [<title>The Dormouse's story</title>]

这就是为什么你的soup.find("Born")返回None,因此它抱怨NoneType(这是None)没有findNext()方法的原因。

你提到的那一页(在写这个答案的时候)包含了“born”这个词的八个副本,没有一个是标签。

查看该页面的HTML源代码,您会发现最好的选择可能是查找正确的范围:

<th scope="row" style="text-align:left;">Born</th>
    <td><span class="nickname">Steven Paul Jobs</span><br />
    <span style="display:none">(<span class="bday">1955-02-24</span>)</span>February 24, 1955<br />

相关问题 更多 >

    热门问题