下面爬虫代码为啥没有string属性 ?请教论坛各位大佬
url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36'}
page_test = requests.get(url,headers=headers)
page_test.encoding = 'utf-8'
soup = BeautifulSoup(page_test.text,'lxml')
li_list = soup.select('.tabli')
print('li_list:',li_list)
fp = open('./sanguoyanyi.txt','w',encoding='utf-8')
for li in li_list:
print(type(li))
print(li)
title = li.a.string
# FIXME
detail_url = 'http://www.shicimingju.com' + li.a['href']
try:
detail_page_text = requests.get(url=detail_url,headers=headers).content
detail_soup =BeautifulSoup(detail_page_text,'html.parser')
div_tag = detail_soup.find('div',class_='chapter_content')
if div_tag:
content = div_tag.text
print(content)
fp.write(title + ':' + content + '\n')
print(title,'爬虫成功')
else:
print(title,'爬取失败')
except requests.exceptions.RequestException as e:
print(f'请求失败:{e}')
fp.close()
报错如下:
Traceback (most recent call last):
File "E:\Projects\Python-Spiders\Examples\11_all_spider_examples\spider_novels\spider_sanguoyanyi.py", line 28, in <module>
title = li.a.string
AttributeError: 'NoneType' object has no attribute 'string'
但是li标签是有东西的啊
根据你的代码和报错信息,问题出在以下几点:
1. **li.a 可能为 None**:在 `li.a.string` 这一行中,如果 `li` 元素没有包含 `<a>` 标签,那么 `li.a` 将会是 `None`,因此在尝试访问 `li.a.string` 时会抛出 `AttributeError`。
2. **检查 `li` 标签结构**:在循环中打印 `type(li)` 和 `li` 自身,你可能需要检查是否每个 `li` 中都包含 `<a>` 标签。如果你的结构不能保证每个 `li` 标签都包含 `<a>` 标签,你需要在访问前添加检查。
以下是可能的解决方法:
for li in li_list:
a_tag = li.find('a')# 尝试在 `li` 中找到 `<a>` 标签
if a_tag and a_tag.string:
title = a_tag.string
detail_url = 'http://www.shicimingju.com' + a_tag['href']
# 继续你的后续代码...
else:
print('No <a> tag or string found in:', li)
这样你就可以避免在 `li.a` 为 `None` 的时候调用 `string` 属性导致的错误。请确保 `<a>` 标签确实在你要解析的 DOM 结构中。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 不行啊
slhlde 发表于 2024-12-02 22:39
不行啊
如果增加检查依然不行,可能需要更仔细地检查 HTML 文档的结构。可以尝试以下步骤:
1. **检查返回的 HTML**:确保页面返回的 HTML 中确实包含你想要解析的内容。有时请求被屏蔽或者返回的不是预期的 HTML。
2. **打印并检查 `li_list`**:在代码中打印 `li_list` 以确认它是否为空或者里面的结构是否与预期一致:
print('li_list:', li_list)
3. **手动检查 HTML 结构**:从浏览器中查看 `https://www.shicimingju.com/book/sanguoyanyi.html` 源代码,确认 `li` 标签和其中的内容。
如果网页结构变化,可能需要使用不同的选择器来获取数据。例如,尝试检查 `li_list` 中的每个元素:
for li in li_list:
a_tag = li.find('a')# 找到 `a` 标签
if a_tag and 'href' in a_tag.attrs:
title = a_tag.get_text()# 获取文本内容
detail_url = 'http://www.shicimingju.com' + a_tag['href']
# 继续你的后续代码...
else:
print('Notag or href found in:', li)
请确保选择器 `.tabli` 确实可用于目标元素,否则可能需要更改为正确的 CSS 选择器。这样可以确保找到包含 `href` 属性的 `a` 标签,并从中获取连接。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 给你稍微改了一下:
import requests
from bs4 import BeautifulSoup
url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36'}
page_test = requests.get(url,headers=headers)
page_test.encoding = 'utf-8'
soup = BeautifulSoup(page_test.text,'lxml')
li_list = soup.select('.tabli')
print('li_list:',li_list)
fp = open('./sanguoyanyi.txt','w',encoding='utf-8')
for li in li_list:
print(type(li))
print(li)
title = li.string
# FIXME
detail_url = 'http://www.shicimingju.com' + li['href']
try:
detail_page_text = requests.get(url=detail_url,headers=headers).content
detail_soup =BeautifulSoup(detail_page_text,'html.parser')
div_tags = detail_soup.findAll('p')
if div_tags:
fp.write(title + '\n\n')
for div_tag in div_tags:
content = div_tag.text
print(content)
fp.write(content + '\n')
else:
fp.write('\n')
print(title,'爬虫成功')
else:
print(title,'爬取失败')
except requests.exceptions.RequestException as e:
print(f'请求失败:{e}')
fp.close()
给一点我的理解:
循环后li_list后 li的值就是<a>标签本身(<a class="tabli" href="***">****</a>),而不是包含<a>标签的<li>元素
li.a访问的是 嵌套在li里的a标签(<li><a href=''>***</a></li>) 但是<a class="tabli" href="***">****</a> 没有任何的嵌套所以返回NoneType(空值 无值)
所以应该修改为:li.string 啊这这 发表于 2024-12-3 10:57
给一点我的理解:
循环后li_list后 li的值就是标签本身(****),而不是包含标签的元素
li.a访问的是 嵌套 ...
谢谢大佬 你说的有道理 小弟这里拜谢了 isdkz 发表于 2024-12-3 01:08
给你稍微改了一下:
我的代码是哪里出来问题啊 大佬 slhlde 发表于 2024-12-3 21:06
我的代码是哪里出来问题啊 大佬
就是你查找的标签不对,一个就是6楼所说的那样,还有一个就是小说的标签你也不对,不明白你为什么要查找类为'chapter_content'的div标签,我去看了就没有这个类 isdkz 发表于 2024-12-3 21:37
就是你查找的标签不对,一个就是6楼所说的那样,还有一个就是小说的标签你也不对,不明白你为什么要查找 ...
haode 多谢 我再检查下
页:
[1]