举例说明etree.xpath方法中“//”和“/*/”的区别
时间: 2023-12-09 12:06:34 浏览: 46
在 etree.xpath 方法中,"//" 和 "/*/" 都是 XPath 表达式中的路径缩写,但它们的意义是不同的。
- "//":表示选择文档中的所有节点,不考虑它们的位置。
例如,使用 XPath 表达式 "//div" 可以选择文档中所有的 div 标签,不管它们在文档中的位置。
- "/*/":表示选择当前节点的所有子节点。
例如,使用 XPath 表达式 "*/div" 可以选择当前节点下所有的 div 标签,只限于当前节点直接下一层的子节点。
因此,两者的区别在于 "//" 是全文搜索,而 "/*/" 是只搜索当前节点直接下一层的子节点。
相关问题
etree.xpath方法中“//”和“/*/”的区别
在XPath中,“//”和“/*/”都是用来定位XML文档中的元素节点的路径表达式。
“//”表示选择文档中任意位置的元素节点,不论它在文档中的哪个位置,只要是元素节点都会被选中。
例如,使用“//”定位XML文档中所有的book元素节点,可以使用以下XPath表达式:
```
//book
```
“/*/”表示选择文档根节点下的所有子元素节点,只有直接作为根节点子节点的元素才会被选中。
例如,使用“/*/”定位XML文档中所有的book元素节点,可以使用以下XPath表达式:
```
/*/book
```
可以看出,“//”和“/*/”的区别在于选择的元素节点范围不同。如果要选择整个文档中的元素节点,可以使用“//”;如果只想选择根节点下的子元素节点,则可以使用“/*/”。
import requests from lxml import etree import csv 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' } f = open('4399排行.csv', mode='w', encoding='utf-8-sig', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '游戏名称','日期','类型']) csv_writer.writeheader() for i in range(1,11): if i == 1: url = 'https://www.4399.com/flash/game100.htm' html = requests.get(url,headers=headers).content doc = etree.HTML(html) name = doc.xpath('//*[@id="list"]/li/div/a/text()') kind = doc.xpath('//*[@id="list"]/li/span/a/text()') date = doc.xpath('//*[@id="list"]/li/span/text()') data_list = [] for i in range(len(name)): dit = {} dit['游戏名称'] = name[i] dit['类型'] = kind[i] dit['日期'] = date[i] data_list.append(dit) csv_writer.writerow(dit) else: url = 'https://www.4399.com/flash/game100_{}.htm'.format(str(i)) html = requests.get(url,headers=headers).content doc = etree.HTML(html) name = doc.xpath('//*[@id="list"]/li/div/a/text()') kind = doc.xpath('//*[@id="list"]/li/span/a/text()') date = doc.xpath('//*[@id="list"]/li/span/text()') data_list = [] for i in range(len(name)): dit = {} dit['游戏名称'] = name[i] dit['类型'] = kind[i] dit['日期'] = date[i] data_list.append(dit) csv_writer.writerow(dit) print(data_list)怎么改是爬取的时间只保存到月份
可以在爬取日期的代码处,对日期进行处理,只保留到月份。可以使用Python的datetime模块来实现。具体代码如下:
```python
import requests
from lxml import etree
import csv
from datetime import datetime
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'
}
f = open('4399排行.csv', mode='w', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[ '游戏名称','日期','类型'])
csv_writer.writeheader()
for i in range(1,11):
if i == 1:
url = 'https://www.4399.com/flash/game100.htm'
html = requests.get(url,headers=headers).content
doc = etree.HTML(html)
name = doc.xpath('//*[@id="list"]/li/div/a/text()')
kind = doc.xpath('//*[@id="list"]/li/span/a/text()')
date = doc.xpath('//*[@id="list"]/li/span/text()')
data_list = []
for i in range(len(name)):
dit = {}
dit['游戏名称'] = name[i]
dit['类型'] = kind[i]
# 对日期进行格式化,只保留到月份
dit['日期'] = datetime.strptime(date[i], '%Y-%m-%d').strftime('%Y-%m')
data_list.append(dit)
csv_writer.writerow(dit)
else:
url = 'https://www.4399.com/flash/game100_{}.htm'.format(str(i))
html = requests.get(url,headers=headers).content
doc = etree.HTML(html)
name = doc.xpath('//*[@id="list"]/li/div/a/text()')
kind = doc.xpath('//*[@id="list"]/li/span/a/text()')
date = doc.xpath('//*[@id="list"]/li/span/text()')
data_list = []
for i in range(len(name)):
dit = {}
dit['游戏名称'] = name[i]
dit['类型'] = kind[i]
# 对日期进行格式化,只保留到月份
dit['日期'] = datetime.strptime(date[i], '%Y-%m-%d').strftime('%Y-%m')
data_list.append(dit)
csv_writer.writerow(dit)
print(data_list)
```
在上述代码中,我们使用了datetime模块中的strftime方法来将日期格式化为只保留到月份的格式。具体来说,我们使用了`'%Y-%m-%d'`格式来解析原始日期,然后使用`'%Y-%m'`格式来格式化日期。这样就可以实现只保存到月份的效果。