xpath end with
时间: 2023-11-19 10:57:13 浏览: 166
XPath是一种用于在XML文档中定位元素的语言。ends-with()函数是XPath中的一个函数,它用于匹配某个属性值是否以指定的字符串结尾。在XPath 1.0中,没有ends-with()函数,但可以使用contains()函数和string-length()函数来实现类似的功能。在XPath 2.0中,ends-with()函数被正式引入。
如果你的浏览器只支持XPath 1.0,你可以使用contains()函数和string-length()函数来实现ends-with()函数的功能。例如,要查找id属性以“多测师”结尾的元素,可以使用以下XPath表达式:
```
//*[contains(@id, '多测师')][string-length(@id) - string-length('多测师') = last()]
```
这个表达式首先使用contains()函数查找id属性包含“多测师”的元素,然后使用string-length()函数计算id属性值的长度和“多测师”的长度,如果它们相等,那么这个元素就是以“多测师”结尾的元素。
如果你的浏览器支持XPath 2.0,你可以直接使用ends-with()函数。例如,要查找id属性以“多测师”结尾的元素,可以使用以下XPath表达式:
```
//*[ends-with(@id, '多测师')]
```
这个表达式使用ends-with()函数查找id属性以“多测师”结尾的元素。
相关问题
xpath的endwith
XPath是一种用于在XML文档中定位元素的查询语言。XPath提供了多种方法来选择和过滤元素,其中之一就是通过使用`ends-with()`函数来匹配以指定字符串结尾的元素。
`ends-with()`函数接受两个参数:要匹配的字符串和要比较的后缀。它返回一个布尔值,表示给定字符串是否以指定后缀结尾。
以下是使用`ends-with()`函数来选择以指定后缀结尾的元素的示例XPath表达式:
```
//element[ends-with(@attribute, 'suffix')]
```
其中,`//element`表示选择所有名称为"element"的元素,`@attribute`表示选择该元素的名为"attribute"的属性。通过将`ends-with()`函数应用于属性值和指定的后缀,可以筛选出以指定后缀结尾的元素。
例如,如果要选择所有class属性以"suffix"结尾的div元素,可以使用以下XPath表达式:
```
//div[ends-with(@class, 'suffix')]
```
这将选择所有class属性以"suffix"结尾的div元素。
使用xpath编写多线程爬虫(线程数量至少4个,不使用scrapy)爬取杂文标签下 所有书籍(至少爬取前10页)的信息(包括书名、作者、出版社、出版 日期、页数、价格、ISBN号、豆瓣评分、评价人数、书籍封面、 URL),并按照豆瓣评分降序保存(以标签名称命名)
好的,这是一个比较复杂的任务,需要使用多线程和xpath进行爬取数据,并按照豆瓣评分进行排序。下面是一份可供参考的Python代码,希望对你有所帮助:
```python
import requests
from lxml import etree
import threading
from queue import Queue
import time
# 定义爬虫类
class Spider:
def __init__(self, tag):
self.tag = tag
self.base_url = 'https://book.douban.com/tag/' + tag
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
self.q = Queue() # URL队列
self.book_list = [] # 书籍列表
# 获取页面内容并解析
def get_html(self, url):
try:
r = requests.get(url, headers=self.headers, timeout=30)
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return ''
# 获取书籍信息
def get_book_info(self, url):
html = self.get_html(url)
if html:
tree = etree.HTML(html)
name = tree.xpath('//*[@id="wrapper"]/h1/span/text()')[0] # 书名
author = tree.xpath('//*[@id="info"]/span[1]/a/text()')[0] # 作者
press = tree.xpath('//*[@id="info"]/span[2]/a/text()')[0] # 出版社
date = tree.xpath('//*[@id="info"]/span[3]/text()')[0] # 出版日期
page = tree.xpath('//*[@id="info"]/span[4]/text()')[0] # 页数
price = tree.xpath('//*[@id="wrapper"]/div[2]/div/div[1]/div[1]/span[1]/text()')[0] # 价格
isbn = tree.xpath('//*[@id="info"]/span[11]/text()')[0] # ISBN号
score = tree.xpath('//*[@id="interest_sectl"]/div/div[2]/strong/text()')[0] # 豆瓣评分
num = tree.xpath('//*[@id="interest_sectl"]/div/div[2]/div/div[2]/a/span/text()')[0] # 评价人数
cover = tree.xpath('//*[@id="mainpic"]/a/img/@src')[0] # 书籍封面
info = {'name': name, 'author': author, 'press': press, 'date': date, 'page': page, 'price': price, 'isbn': isbn, 'score': score, 'num': num, 'cover': cover, 'url': url}
self.book_list.append(info)
# 获取所有书籍的URL
def get_book_urls(self, page):
url = self.base_url + '?start=' + str(page * 20) + '&type=T'
html = self.get_html(url)
if html:
tree = etree.HTML(html)
urls = tree.xpath('//ul[@class="subject-list"]/li/div[@class="info"]/h2/a/@href')
for u in urls:
self.q.put(u)
# 线程函数
def worker(self):
while not self.q.empty():
url = self.q.get()
self.get_book_info(url)
self.q.task_done()
# 启动爬虫
def start(self, thread_num=4):
# 获取所有书籍的URL
for page in range(10):
self.get_book_urls(page)
# 创建线程
for i in range(thread_num):
t = threading.Thread(target=self.worker)
t.start()
# 阻塞主线程,等待所有任务完成
self.q.join()
# 按照豆瓣评分降序保存书籍信息
self.book_list = sorted(self.book_list, key=lambda x: float(x['score']), reverse=True)
with open(self.tag + '.txt', 'w', encoding='utf-8') as f:
for book in self.book_list:
f.write('书名:' + book['name'] + '\n')
f.write('作者:' + book['author'] + '\n')
f.write('出版社:' + book['press'] + '\n')
f.write('出版日期:' + book['date'] + '\n')
f.write('页数:' + book['page'] + '\n')
f.write('价格:' + book['price'] + '\n')
f.write('ISBN号:' + book['isbn'] + '\n')
f.write('豆瓣评分:' + book['score'] + '\n')
f.write('评价人数:' + book['num'] + '\n')
f.write('书籍封面:' + book['cover'] + '\n')
f.write('URL:' + book['url'] + '\n\n')
if __name__ == '__main__':
start_time = time.time()
spider = Spider('杂文') # 爬取杂文标签下的书籍
spider.start()
end_time = time.time()
print('爬取完成,用时%.2f秒' % (end_time - start_time))
```
在上面的代码中,我们首先定义了一个Spider类,其中包含了获取页面内容、获取书籍信息、获取所有书籍的URL、线程函数、启动爬虫等方法。在启动爬虫时,我们首先获取所有书籍的URL,然后创建指定数量的线程,每个线程从URL队列中取出一个URL,获取该书籍的信息,并将信息添加到书籍列表中。在所有线程完成任务后,我们按照豆瓣评分降序保存书籍信息。
这份代码使用了多线程和xpath技术,可以爬取杂文标签下的所有书籍信息,包括书名、作者、出版社、出版日期、页数、价格、ISBN号、豆瓣评分、评价人数、书籍封面和URL,并按照豆瓣评分进行排序。如果你需要爬取其他标签下的书籍信息,只需要修改Spider类的构造函数中的tag变量即可。
阅读全文