python用xpath拿div标签下所有p标签的所有文本以及p标签包含的strong标签的文本
时间: 2024-05-02 12:20:47 浏览: 15
可以使用下面的代码实现:
```python
import requests
from lxml import etree
url = '网页链接'
html = requests.get(url).text
selector = etree.HTML(html)
div_list = selector.xpath('//div') # 获取所有 div 标签
for div in div_list:
p_list = div.xpath('.//p') # 获取当前 div 标签下所有 p 标签
for p in p_list:
text_list = p.xpath('.//text()') # 获取当前 p 标签下所有文本
strong_list = p.xpath('.//strong/text()') # 获取当前 p 标签下所有 strong 标签的文本
all_text_list = text_list + strong_list # 合并文本
print(''.join(all_text_list)) # 输出合并后的文本
```
注意,需要将 `网页链接` 替换成实际网页的链接。
相关问题
item['RatingNumber'] = "".join( trees.xpath('//*[@id="interest_sectl"]/div/div[2]/strong/text()')).replace(" ", "")改为用xpath爬取豆瓣图书标签: 中国文学下所有书籍(至少爬取前10页)的豆瓣评分
好的,我可以提供代码示例来回答您的问题。
首先,您需要安装Python的requests和lxml库,可以通过以下命令进行安装:
```
pip install requests
pip install lxml
```
然后,您可以使用以下代码来爬取豆瓣图书标签中中国文学分类下所有书籍的豆瓣评分:
```python
import requests
from lxml import etree
url = 'https://book.douban.com/tag/%E4%B8%AD%E5%9B%BD%E6%96%87%E5%AD%A6?start={}&type=T'
score_list = []
for i in range(10):
start = i * 20
response = requests.get(url.format(start))
html = etree.HTML(response.text)
book_list = html.xpath('//ul[@class="subject-list"]/li')
for book in book_list:
score = book.xpath('.//span[@class="rating_nums"]/text()')
if score:
score_list.append(float(score[0]))
print(score_list)
```
解释一下上述代码:
1. 首先,我们定义了一个URL模板,其中`{}`的位置将会被替换成不同的页数。
2. 然后,我们定义了一个空列表`score_list`,用于存储所有书籍的豆瓣评分。
3. 接下来,我们使用一个循环来遍历前10页的书籍。在每个循环中,我们使用`requests`库发送GET请求,获取当前页的HTML代码。
4. 然后,我们使用`lxml`库的`etree`模块来解析HTML代码,并使用XPath表达式提取每本书的豆瓣评分。如果某本书没有评分,则跳过该书籍。
5. 最后,我们将所有评分添加到`score_list`列表中,并最终输出该列表。
希望这段代码能够回答您的问题。
使用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变量即可。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
# 目标网站:www.hongniuziyuan.com # 爬取下来的数据格式 # 保存到记事本中 # 电影名字|导演|演员|评分|所属地区|播放地址 # 变形金刚|小斯蒂芬·卡普尔|安东尼·拉莫斯,多米尼克·菲什巴克,彼特·库伦,朗·普尔曼,彼特·丁拉|0.0|美国|https://hnzy.bfvvs.com/play/YervnY4e import requests from lxml import etree response = requests.get("https://www.hongniuziyuan.com/") html = response.content.decode() # 将二进制数据转换为文本数据 # response.text 文本数据 # print(html) # 将我们字符串转换为一个dom树 dom = etree.HTML(html) # 目的就是为了使用xpath语法去寻找我们的想要的标签 # xpath语法 # xs = dom.xpath('/html/body/div[3]/div[3]/ul/div/li/div/a/img') xs = dom.xpath('/html/body/div[4]/ul[2]/li/strong/span[1]/a') #元素:妖神记 第五季 [第328集完结] #xpath:/html/body/div[4]/ul[2]/li/strong/span[1]/a for s in xs:
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)