Python - 'NoneType' 对象没有属性 'find_next_sibling'
Python - 'NoneType' object has no attribute 'find_next_sibling'
我试图制作一个获取 "See also" link 文本的维基百科爬虫,然后输入标记 link 的网址。但是,文章的 "See also" 部分(这是一个无组织的列表)没有任何 class 或 id,所以我使用方法 "find_next_sibling" 获取它。接下来,它遍历那里的每个 linked 维基百科页面,并做同样的事情。这是我的代码:
import requests
from bs4 import BeautifulSoup
def wikipediaCrawler(page, maxPages):
pageNumber = 1
while pageNumber < maxPages:
url = "https://en.wikipedia.org" + page
sourceCode = requests.get(url)
print(sourceCode)
plainText = sourceCode.text
soup = BeautifulSoup(plainText, "html.parser")
ul = soup.find("h2", text="See also").find_next_sibling("ul")
for li in ul.findAll("li"):
print(li.get_text())
for link in ul.findAll('a'):
page = str(link.get('href'))
print(page)
pageNumber += 1
wikipediaCrawler("/wiki/Online_chat", 3)
第一页打印正常。
问题是,每当它尝试切换页面时,我都会收到此错误:
Traceback (most recent call last):
File "C:/Users/Shaman/PycharmProjects/WebCrawler/main.py", line 23, in <module>
wikipediaCrawler("/wiki/Online_chat", 3)
File "C:/Users/Shaman/PycharmProjects/WebCrawler/main.py", line 14, in wikipediaCrawler
ul = soup.find("h2", text="See also").find_next_sibling("ul")
AttributeError: 'NoneType' object has no attribute 'find_next_sibling'
我打印了请求函数,它说 "Response<200>" 所以它看起来不像是权限问题。老实说,我不知道为什么会这样。有任何想法吗?提前致谢
编辑:我知道它搜索的维基百科文章都包含带有文本 "See also" 的标签。在这种情况下,它搜索了 "Voice_chat" 篇文章,尽管它在那里,但没有找到任何东西。
这段代码soup.find("h2", text="See also")
有时找不到元素然后returnNone
.
快速修复是通过错误:
import requests
from bs4 import BeautifulSoup
def wikipediaCrawler(page, maxPages):
pageNumber = 1
while pageNumber < maxPages:
try:
url = "https://en.wikipedia.org" + page
sourceCode = requests.get(url)
print(sourceCode)
plainText = sourceCode.text
soup = BeautifulSoup(plainText, "html.parser")
ul = soup.find("h2", text="See also").find_next_sibling("ul")
for li in ul.findAll("li"):
print('li: ', pageNumber, li.get_text())
for link in ul.findAll('a'):
page = str(link.get('href'))
print('a:', pageNumber, page)
except Exception, e:
print e
print soup.find("h2", text="See also")
pageNumber += 1
wikipediaCrawler("/wiki/Online_chat", 3)
我在打印中添加了一个小改动,以便调试更容易。
我认为您需要在 "See also" 部分开始的 h2
标记之后添加 <ul>
。
找到 h2
的一种方法是使用 CSS selectors 找到正确的标签,然后获取父元素(h2
),然后从中获取下一个兄弟元素那里:
def wikipediaCrawler(page, maxPages):
#...
soup = BeautifulSoup(plainText, "html.parser")
see_also = soup.select("h2 > #See_also")[0]
ul = see_also.parent.find_next_sibling("ul")
for link in ul.findAll('a'):
page = str(link.get('href'))
print(page)
wikipediaCrawler("/wiki/Online_chat", 3)
输出:
/wiki/Chat_room
/wiki/Collaborative_software
/wiki/Instant_messaging
/wiki/Internet_forum
/wiki/List_of_virtual_communities_with_more_than_100_million_active_users
/wiki/Online_dating_service
/wiki/Real-time_text
/wiki/Videotelephony
/wiki/Voice_chat
/wiki/Comparison_of_VoIP_software
/wiki/Massively_multiplayer_online_game
/wiki/Online_game
/wiki/Video_game_culture
我试图制作一个获取 "See also" link 文本的维基百科爬虫,然后输入标记 link 的网址。但是,文章的 "See also" 部分(这是一个无组织的列表)没有任何 class 或 id,所以我使用方法 "find_next_sibling" 获取它。接下来,它遍历那里的每个 linked 维基百科页面,并做同样的事情。这是我的代码:
import requests
from bs4 import BeautifulSoup
def wikipediaCrawler(page, maxPages):
pageNumber = 1
while pageNumber < maxPages:
url = "https://en.wikipedia.org" + page
sourceCode = requests.get(url)
print(sourceCode)
plainText = sourceCode.text
soup = BeautifulSoup(plainText, "html.parser")
ul = soup.find("h2", text="See also").find_next_sibling("ul")
for li in ul.findAll("li"):
print(li.get_text())
for link in ul.findAll('a'):
page = str(link.get('href'))
print(page)
pageNumber += 1
wikipediaCrawler("/wiki/Online_chat", 3)
第一页打印正常。 问题是,每当它尝试切换页面时,我都会收到此错误:
Traceback (most recent call last):
File "C:/Users/Shaman/PycharmProjects/WebCrawler/main.py", line 23, in <module>
wikipediaCrawler("/wiki/Online_chat", 3)
File "C:/Users/Shaman/PycharmProjects/WebCrawler/main.py", line 14, in wikipediaCrawler
ul = soup.find("h2", text="See also").find_next_sibling("ul")
AttributeError: 'NoneType' object has no attribute 'find_next_sibling'
我打印了请求函数,它说 "Response<200>" 所以它看起来不像是权限问题。老实说,我不知道为什么会这样。有任何想法吗?提前致谢
编辑:我知道它搜索的维基百科文章都包含带有文本 "See also" 的标签。在这种情况下,它搜索了 "Voice_chat" 篇文章,尽管它在那里,但没有找到任何东西。
这段代码soup.find("h2", text="See also")
有时找不到元素然后returnNone
.
快速修复是通过错误:
import requests
from bs4 import BeautifulSoup
def wikipediaCrawler(page, maxPages):
pageNumber = 1
while pageNumber < maxPages:
try:
url = "https://en.wikipedia.org" + page
sourceCode = requests.get(url)
print(sourceCode)
plainText = sourceCode.text
soup = BeautifulSoup(plainText, "html.parser")
ul = soup.find("h2", text="See also").find_next_sibling("ul")
for li in ul.findAll("li"):
print('li: ', pageNumber, li.get_text())
for link in ul.findAll('a'):
page = str(link.get('href'))
print('a:', pageNumber, page)
except Exception, e:
print e
print soup.find("h2", text="See also")
pageNumber += 1
wikipediaCrawler("/wiki/Online_chat", 3)
我在打印中添加了一个小改动,以便调试更容易。
我认为您需要在 "See also" 部分开始的 h2
标记之后添加 <ul>
。
找到 h2
的一种方法是使用 CSS selectors 找到正确的标签,然后获取父元素(h2
),然后从中获取下一个兄弟元素那里:
def wikipediaCrawler(page, maxPages):
#...
soup = BeautifulSoup(plainText, "html.parser")
see_also = soup.select("h2 > #See_also")[0]
ul = see_also.parent.find_next_sibling("ul")
for link in ul.findAll('a'):
page = str(link.get('href'))
print(page)
wikipediaCrawler("/wiki/Online_chat", 3)
输出:
/wiki/Chat_room
/wiki/Collaborative_software
/wiki/Instant_messaging
/wiki/Internet_forum
/wiki/List_of_virtual_communities_with_more_than_100_million_active_users
/wiki/Online_dating_service
/wiki/Real-time_text
/wiki/Videotelephony
/wiki/Voice_chat
/wiki/Comparison_of_VoIP_software
/wiki/Massively_multiplayer_online_game
/wiki/Online_game
/wiki/Video_game_culture