我想使用Python 3使用requests
和BeautifulSoup
模块进行网页抓取,但我遇到了错误。我的代码是否有问题?我如何修复错误?
import requests
from bs4 import BeautifulSoup
url = 'https://otakudesu.lol/genre-list/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
genres_div = soup.find('div', class_='genres')
genre_links = genres_div.find_all('a')
path = []
text = []
for link in genre_links:
path.append(link['href'])
text.append(link.text)
print(path)
print(text)
错误:
genre_links = genres_div.find_all('a')
^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'find_all'
如何修复错误?
3条答案
按热度按时间nbnkbykc1#
你在这个地方有一个错误
genres_div = soup.find('div', class_='genres')
。你正在寻找'div'
标签,但你应该寻找'ul'
标签。下面是工作代码:结果:
xn1cxnb42#
genres_div
应该是**ul
**标签(不是 *div
*),带 *class="genres"
*。】错误:
这表明
genres_div
返回None
;为了避免引发错误,您可以检查它并将genre_links
设置为默认的空列表如果
genres_div
在某些时候只是null,并且在这种情况下您只需要空的path
和text
列表,那么这很好。但是,如果您想调查 * 为什么 *
genres_div
没有返回任何内容,很可能是因为您试图使用但我找不到任何
div
在source html与class_='genres'
。我能找到的唯一一个带有这个类的标签(view screenshot)是一个
ul
标签,它确实包含了一个链接列表;所以你可以把上面的行改为genres_div = soup.find('ul', class_='genres')
,但是我发现链接find...
调用通常是有风险的,通常更喜欢使用.select
和CSS选择器(由SoupSieve处理),比如:如果这些 * 是 * 您想要的链接,那么您也可以完全绕过
.genres
,通过title
属性搜索它们:顺便说一句,你也可以用list comprehension得到
path
和text
列表,而不是在循环中追加。无论使用哪种方法,
print(f'{path_text_pairs = }\n\n{path = }\n{text = }')
都应该打印:完整工作代码的建议版本:
这样,如果没有结果,您可以打开
dump_fp
文件(并检查with JavaScript disabled)以检查您的代码正在使用的HTML源[有时是not the same as what you can inspect on your browser,即使您的请求得到了OK
响应]。qpgpyjmq3#
先生,你是想得到class=genre吧?你代码的问题是genre的类继承给ul而不是div。
所以我改变了
genres_div = soup.find('div', 'genres')
到
如果还有什么需要我会很乐意帮忙的:)