etree.xpath方法中“//”和“/*/”的区别
时间: 2023-12-01 11:03:33 浏览: 254
在XPath中,“//”和“/*/”都是用来定位XML文档中的元素节点的路径表达式。
“//”表示选择文档中任意位置的元素节点,不论它在文档中的哪个位置,只要是元素节点都会被选中。
例如,使用“//”定位XML文档中所有的book元素节点,可以使用以下XPath表达式:
```
//book
```
“/*/”表示选择文档根节点下的所有子元素节点,只有直接作为根节点子节点的元素才会被选中。
例如,使用“/*/”定位XML文档中所有的book元素节点,可以使用以下XPath表达式:
```
/*/book
```
可以看出,“//”和“/*/”的区别在于选择的元素节点范围不同。如果要选择整个文档中的元素节点,可以使用“//”;如果只想选择根节点下的子元素节点,则可以使用“/*/”。
相关问题
html_etree = etree.HTML(repones) #利用lxml解析上面爬取的html文件 html_etree = etree.HTML(repones) #过滤 li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li') for a in li: #电影名称 name = a.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0] # print (name) #链接 dy_url = a.xpath('./div/div[2]/div[1]/a/@href')[0] # print (dy_url) #评分 rating = a.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0] # print (rating) rating_num = a.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0] # print (rating_num) content = a.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0] print (content,name,dy_url,rating,rating_num)
根据你提供的代码,你使用了 `lxml` 库对爬取到的 HTML 内容进行解析,并从中提取了电影名称、链接、评分等信息。
首先,你使用 `etree.HTML()` 方法将 `repones`(即爬取到的 HTML 内容)传递给 `etree.HTML`,以便使用 `lxml` 解析库解析 HTML。
然后,你使用 `xpath()` 方法从解析后的 HTML 树中提取所需的信息。在这个例子中,你使用了 XPath 表达式来定位电影列表的每个 `<li>` 元素。然后,对于每个 `<li>` 元素,你使用 XPath 表达式来提取电影名称、链接、评分等信息。
最后,你使用 `print()` 函数将提取到的电影信息打印出来。
请注意,代码中的 XPath 表达式是根据具体页面结构编写的,如果你爬取的网页结构有所变化,可能需要相应调整 XPath 表达式来匹配正确的元素。
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'`格式来格式化日期。这样就可以实现只保存到月份的效果。
阅读全文