lis = data.find('ul') AttributeError: 'NoneType' object has no attribute 'find'
时间: 2024-01-08 14:03:40 浏览: 27
根据提供的引用内容,出现了一个AttributeError: 'NoneType' object has no attribute 'find'的错误。这个错误通常发生在尝试在一个None对象上调用find()方法时。这意味着在这段代码中,data对象是None,而不是一个有效的对象。
为了解决这个问题,你可以检查一下data对象是否被正确地初始化或赋值。确保data对象是一个有效的对象,并且具有find()方法。
另外,你还可以使用条件语句来检查data对象是否为None,以避免出现这个错误。例如:
```python
if data is not None:
lis = data.find('ul')
```
这样,只有当data对象不为None时,才会执行find()方法。
相关问题
selector = parsel.Selector(html_data) lis = selector.css('.list_item h2 a::attr(href)').getall() details = [] for li in lis: detail_url = 'https://travel.qunar.com'+ li detail_html = requests.get(detail_url).text只能输出最后一个域名的网站
根据您提供的代码,您将多个域名与一个网站合并的方式是将多个 detail_url 存储在一个列表中,然后对列表进行循环遍历,依次发送请求获取每个网站的 html 数据。
在循环中,您使用 `detail_url = 'https://travel.qunar.com'+ li` 将当前遍历到的 li 和 'https://travel.qunar.com' 进行拼接,从而获取完整的 detail_url。但是,您没有将获取到的每个网站的 html 数据存储在一个列表中,而是每次都将获取到的 html 数据赋值给了 detail_html 变量,因此最终 detail_html 只会保存最后一个网站的 html 数据。
为了解决这个问题,您可以将每个网站的 html 数据存储在一个列表中,然后在循环结束后对列表进行处理。修改后的代码如下:
```python
selector = parsel.Selector(html_data)
lis = selector.css('.list_item h2 a::attr(href)').getall()
details = []
for li in lis:
detail_url = 'https://travel.qunar.com' + li
detail_html = requests.get(detail_url).text
details.append(detail_html)
# 对获取到的每个网站的 html 数据进行处理
for detail_html in details:
# 处理代码
pass
```
这样,每次获取到的网站的 html 数据都会被存储在 details 列表中,循环结束后可以对列表中的数据进行处理。
import requests import parsel import csv f = open('射击.csv', mode='w', encoding='utf-8-sig', newline='') csv_writer = csv.DictWriter(f, fieldnames=['游戏名字', '游戏地址']) csv_writer.writeheader() for page in range(1, 300): url = 'https://www.4399.com/flash_fl/4_1.htm'.format(page) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' } response = requests.get(url=url, headers=headers) response.encoding = response.apparent_encoding selector = parsel.Selector(response.text) lis = selector.css('#classic li') for li in lis: dit ={} data_url = li.css('a::attr(href)').get() new_url = 'http://www.4399.com' + data_url.replace('http://','/') dit['游戏地址'] = new_url title = li.css('img::attr(alt)').get() dit['游戏名字'] = title print(title, new_url) csv_writer.writerow(dit)怎么改成用xpath的
你可以将 `selector = parsel.Selector(response.text)` 改为 `selector = etree.HTML(response.text)`,然后使用 XPath 语法来解析 HTML 页面,下面是修改后的代码:
```
import requests
from lxml import etree
import csv
f = open('射击.csv', mode='w', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['游戏名字', '游戏地址'])
csv_writer.writeheader()
for page in range(1, 300):
url = 'https://www.4399.com/flash_fl/4_1.htm'.format(page)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding
selector = etree.HTML(response.text)
lis = selector.xpath('//*[@id="classic"]/li')
for li in lis:
dit = {}
data_url = li.xpath('a/@href')[0]
new_url = 'http://www.4399.com' + data_url.replace('http://', '/')
dit['游戏地址'] = new_url
title = li.xpath('a/img/@alt')[0]
dit['游戏名字'] = title
print(title, new_url)
csv_writer.writerow(dit)
f.close()
```
这里使用 XPath 语法,将 `lis` 变量中的值直接改为 `li`,然后在内部使用 XPath 表达式来获取游戏地址和游戏名称。