利用xpath+re获取中医宝典中的中药详情信息

完整代码

from lxml import etree
import requests
import re

def spider(name,img_path):
    url="http://zhongyibaodian.com/zhongcaoyaotupian/"+name+".html"
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
        }

    page_text=requests.get(url=url,headers=headers)
    #如果不加这个会解析出乱码
    page_text.encoding="gb23112"
    page_text=page_text.text

    ex='<a target="_blank" href="http://zhongyaocai360.com/zhuzhi/.*?">'
    a_list=re.findall(ex,page_text,re.S)
    # print(a_list)
    for a in a_list:
        page_text=page_text.replace(a,"")
    page_text=page_text.replace("<br/>","")
    page_text=page_text.replace("</a>","")
    # print(page_text)

    tree=etree.HTML(page_text)

    #获取中药名称
    title=tree.xpath('//*[@id="divMain"]/div/h1/text()')[0]
    # print(title)

    #获取中药的详情信息
    result=""
    content=tree.xpath('//div[@class="spider"]/p[4]/text()')
    if content!=[]:
        p_list = tree.xpath('//div[@class="spider"]/p/text()')
        for p in p_list:
            result += p

    else:
        content=tree.xpath('//div[@class="spider"]/p[3]/text()')
        if content==[]:
            content=tree.xpath('//div[@class="spider"]/p[2]/text()')
        result=content[0]
    result=result.replace("【","\n【")
    # print(result)
    with open(img_path,'a') as fp:
        fp.write("名称:"+title+'\n'+result+'\n\n\n')



#解表药
##辛温解表药
xinwenjiebiaoyao=['mahuang','guizhi','xixin','jingjie','fangfeng','baizhi','qianghuo','gaoben','xinyi','sugeng','chengliu',
                  'congbai','husui','shengjiang']

for name in xinwenjiebiaoyao:
    spider(name,'../中药信息/解表药/辛温解表药.txt')
    print(name+'爬取成功!')


##二、辛凉解表药
xinliangjiebiaoyao=['baohe','niubangzi','chantui','sangye','juhua','yejuhua','shengma','chaihu','gegen','manjingzi','fuping',
                    'muzei','gehua','dandouchi','dadouhuangjuan','heizha']

for name in xinliangjiebiaoyao:
    spider(name,'../中药信息/解表药/辛凉解表药.txt')
    print(name+'爬取成功!')

代码讲解

首先我们利用xpath找到这一段。
在这里插入图片描述
但是我们解析出来是这样的,看到看到a标签中的数据并没有解析出来。
在这里插入图片描述
因此我可利用正则表达式将符合条件的a标签去掉,只留下其中的文本内容。

ex='<a target="_blank" href="http://zhongyaocai360.com/zhuzhi/.*?">'
a_list=re.findall(ex,page_text,re.S)
for a in a_list:
    page_text=page_text.replace(a,"")
page_text=page_text.replace("<br/>","")
page_text=page_text.replace("</a>","")

此时我们在解析出来就是这样
在这里插入图片描述
获得的就是只有一个元素的列表
在这里插入图片描述
因为此网站的页面设计并不是统一的,因此我们需要判断多种情况,在爬取的时候才不会出现例外

content=tree.xpath('//div[@class="spider"]/p[4]/text()')
    if content!=[]:
        p_list = tree.xpath('//div[@class="spider"]/p/text()')
        for p in p_list:
            result += p

    else:
        content=tree.xpath('//div[@class="spider"]/p[3]/text()')
        if content==[]:
            content=tree.xpath('//div[@class="spider"]/p[2]/text()')
        result=content[0]

最后结果

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NestJS 是一个用于构建高效、可扩展的服务器端应用程序的框架,它基于 TypeScript 编写,并且使用了面向对象的编程(OOP)和函数式编程(FP)的最佳实践。XPath 是一种用于在 XML 文档定位节点的语言。在 NestJS 使用 XPath 可以方便地对 XML 数据进行解析和处理。 在 NestJS 使用 XPath,你可以按照以下步骤进行操作: 1. 首先,安装相关的依赖包。你可以使用 npm 或者 yarn 进行安装,例如: ``` npm install xpath ``` 2. 在你的 NestJS 项目引入 xpath 模块: ```typescript import * as xpath from 'xpath'; ``` 3. 使用 xpath 模块的 `select` 方法来选择符合条件的节点。例如,假设你有一个 XML 文档如下: ```xml <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="en">Harry Potter</title> <author>J.K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> ``` 你可以使用以下代码来选择所有书籍的标题: ```typescript const xml = // your XML document as a string const doc = new DOMParser().parseFromString(xml, 'application/xml'); const select = xpath.useNamespaces({ 'ns': 'http://www.w3.org/1999/xhtml' }); const nodes = select('//ns:book/ns:title', doc); for (const node of nodes) { console.log(node.textContent); } ``` 这样就可以打印出所有书籍的标题。 希望以上信息对你有所帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值