slhlde 发表于 2024-12-2 22:26:19

下面爬虫代码为啥没有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标签是有东西的啊

FishC 发表于 2024-12-2 22:29:33

根据你的代码和报错信息,问题出在以下几点:

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-2 22:39:12

不行啊

FishC 发表于 2024-12-2 22:39:40

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 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-12-3 01:08:37

给你稍微改了一下:
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()

啊这这 发表于 2024-12-3 10:57:58

给一点我的理解:
循环后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

slhlde 发表于 2024-12-3 21:06:09

啊这这 发表于 2024-12-3 10:57
给一点我的理解:
循环后li_list后 li的值就是标签本身(****),而不是包含标签的元素
li.a访问的是 嵌套 ...

谢谢大佬 你说的有道理 小弟这里拜谢了

slhlde 发表于 2024-12-3 21:06:42

isdkz 发表于 2024-12-3 01:08
给你稍微改了一下:

我的代码是哪里出来问题啊 大佬

isdkz 发表于 2024-12-3 21:37:34

slhlde 发表于 2024-12-3 21:06
我的代码是哪里出来问题啊 大佬

就是你查找的标签不对,一个就是6楼所说的那样,还有一个就是小说的标签你也不对,不明白你为什么要查找类为'chapter_content'的div标签,我去看了就没有这个类

slhlde 发表于 2024-12-11 22:44:47

isdkz 发表于 2024-12-3 21:37
就是你查找的标签不对,一个就是6楼所说的那样,还有一个就是小说的标签你也不对,不明白你为什么要查找 ...

haode 多谢 我再检查下
页: [1]
查看完整版本: 下面爬虫代码为啥没有string属性 ?请教论坛各位大佬