xpath获取两个标签之间的内容

在使用xpath解析网页数据时,会面临一些不好处理的网页,如下所示:

<p>  感冒是由于感触风邪或时行病毒,引起肺卫功能失调,出现鼻塞、流涕、喷嚏、头痛、恶寒、发热、全身不适等一系列临床表现的一种病证。其临床表现与西医学所称的急性上呼吸道感染相似。普通感冒、流行性感冒、咽炎、扁桃体炎、喉炎等均可参考本病辨证论治。</p> 
<p><strong>  [诊断]</strong></p> 
<p>  1恶寒发热、鼻塞、流涕、喷嚏等症状为主,多兼咳嗽,可伴咽喉痒或痛、呕吐、腹泻或高热惊厥。</p> 
<p>  2 四时皆有,以冬春季节为多见,常因骤变而发病。</p> 
<p>  3 一般病毒感染者血白细胞总数正常或偏低,中性粒细胞减少,淋巴细胞相对增多,单核细胞增加。细菌感染者白细胞计数增多,中性粒细胞增多。</p> 
<p><strong>  [辨证论治]</strong></p> 
<p>  1 风寒束表 症候:鼻塞声重,喷嚏,流清涕,恶寒发热或发热不甚,无汗,周身酸痛,咳嗽痰白质稀,舌苔薄白,脉浮紧。 治法:辛温解表,宣肺散寒。 例方:荆防败毒散。</p> 
<p>  2 风热犯表 症状:发热或高热,微恶风,鼻塞喷嚏,流稠涕,汗出口干,咽喉痛,咳嗽痰稠,舌苔薄黄,脉浮数。 治法:辛凉解表,宣肺清热。 例方:银翘散。</p> 
<p>  3 暑湿感冒 症状:发热,汗出热不解,鼻塞流浊涕,头昏重胀痛,身重倦怠,心烦口渴,胸闷欲呕,尿短赤,舌苔黄腻,脉濡数。 治法:清暑祛湿解表。 例方:新加香薷饮。</p> 
<p>  4 虚体感冒</p> 
<p>  4.1 气虚感冒 症状:恶寒较甚,发热,无汗,头痛身楚,咳嗽,痰白,咯痰无力,平素神疲体弱,气短懒言,反复易感,舌淡苔白,脉浮无力。 治法:益气解表 例方:参苏饮。</p> 
<p>  4.2 阴虚感冒</p> 
<p>  症状:身热,微恶风寒,少汗,头昏,心烦,口干,干咳少痰,舌红少苔,脉细数。 治法:滋阴解表。 例方:加减葳蕤汤。</p> 
<p><strong>  [其他疗法]</strong></p> 
<p>  1 中成药</p> 
<p>  1.1 风寒证可口服午时茶、通宣理肺丸。</p> 
<p>  1.2 风热证可口服银翘解毒片,羚翘解毒片,桑菊感冒冲剂。</p> 
<p>  1.3 感冒兼见脾胃湿困诸症者可用藿香正气丸。</p> 
<p>  1.4 时行感冒可口服板蓝根冲剂。</p> 
<p>  2 中药针剂 风热证、暑湿证及表寒里热证均可用喜炎平、双黄连加入5%葡萄糖注射液内静滴,每日1次。</p> 
<p>  3 外治疗法</p> 
<p>  3.1大蒜液滴鼻,10%大蒜液每次1滴,每日滴3~5次。适用于各证型感冒。</p> 
<p>  3.2 拔火罐可取大椎、身柱、大杼、肺俞、风门等穴,每日1次。适用于风寒证。</p> 
<p><strong>  [治法改进]</strong></p> 
<p>  感冒轻证,或初起偏寒偏热俱不明显,仅稍有恶风、微热、头胀、鼻塞者,可予辛凉轻剂,疏风解表,药用桑叶、薄荷、防风、荆芥等微辛轻清透邪。咽痒咳嗽者,酌配前胡、牛蒡子、贝母、橘红、桔梗、甘草等清宣肺气。</p> 
<p><strong>  [疗效标准]</strong></p> 
<p>  1 治愈:症状消失,实验室检查恢复正常。</p> 
<p>  2 好转:发热消退,临床症状减轻,实验室检查基本正常。</p> 
<p>  3 未愈:临床症状无改善或加重,实验室检查与治疗前比较无明显改善或加重。</p>
<font color="gray"> <p><font color="gray">(摘自《中医常见病及优势病种诊疗常规》,仅供参考,请在医师指导下使用。)</font></p></font>

目标是分别拿到<p><strong></strong></p>中的文本和其后跟随的<p>标签的内容。
使用xpath进行处理:

  results = html.xpath("//strong[text()='  [诊断]']/following::p[position()<count(//strong[text()='  [诊断]']/following::p) - count(//strong[text()='  [辨证论治]']/following::p)+1]/text()")

拿到数据在将结果保存为自己想要的格式即可。
附上全部代码:

import requests
from lxml import etree
import json
import re
from bs4 import BeautifulSoup

class Disease_Species():
    def __init__(self):
        # 真实url :https://api.cntcm.com.cn/api/getArticles?cid=2262&pageSize=25&pageNumber=1
        self.url = "https://api.cntcm.com.cn/api/getArticles?"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
        }


    def run(self):
        for i in range(1,3):
            url = self.url + "cid=2262&pageSize=25&pageNumber={}".format(i)
            response = requests.get(url=url,headers=self.headers)
            print(response.status_code)
            # print(response.text)
            if response.status_code == 200:
                # 定义存储字典
                disease_dict = {}
                # json 类型
                text = response.text
                text_json = json.loads(text)
                text_list = text_json['list']
                for text in text_list:
                    # print(text)
                    # 构造url的id
                    fileID = text['fileID']
                    # 病种名称
                    disease_name = text['title']

                    file_url = "https://api.cntcm.com.cn/api/getArticle?aid={}".format(fileID)
                    print(file_url)
                    file_url_response = requests.get(url=file_url,headers=self.headers)
                    file_url_text = json.loads(file_url_response.text)
                    content = file_url_text['content']
                    #print(content)

                    #exit()
                    html = etree.HTML(content)
                    # print(html)
                    # 病种的简介
                    abstract = html.xpath("//p[1]/text()")
                    abstract = ''.join(abstract).strip()
                    if abstract is None:
                        break


                    strong_list = html.xpath("//p/strong")
                    #  bs4
                    #  bs4 = BeautifulSoup(content, features="lxml")
                    # print(strong_list)
                    strong_name_list = []
                    strong_name_str_list = []
                    for i in range(len(strong_list)):
                        #print(i)
                        strong_name = strong_list[i].xpath("text()")
                        strong_name = ''.join(strong_name)
                        strong_name_str = ''.join(strong_name).replace("[","").replace("]","").strip()
                        #print(strong_name_str)
                        strong_name_list.append(strong_name)
                        strong_name_str_list.append(strong_name_str)

                    # print(bs4.text)
                    print("*************")
                    #print(strong_name_list)
                    results_list = []
                    for i in range(len(strong_name_list)):
                        if i < len(strong_name_list)-1:
                            results = html.xpath("//strong[text()='{}']/following::p[position()<count(//strong[text()='{}']/following::p) - count(//strong[text()='{}']/following::p)+1]/text()".format(strong_name_list[i],strong_name_list[i],strong_name_list[i+1]))
                            results = ''.join(results).replace("[","").replace("]","").strip()
                            #print(strong_name_str_list[i], results)
                            results_dict = {
                                "{}".format(strong_name_str_list[i]):"{}".format(results)
                            }
                            results_list.append(results_dict)

                        else:
                            results = html.xpath("//strong[text()='{}']/following::p/text()".format(strong_name_list[i]))
                            results = ''.join(results).replace("[","").replace("]","").strip()
                            #print(strong_name_str_list[i], results)
                            results_dict = {
                                "{}".format(strong_name_str_list[i]): "{}".format(results)
                            }
                            results_list.append(results_dict)

                    disease_dict = {
                        "disease_name":disease_name,
                        "abstract":abstract,
                        "data":results_list
                    }

                    print(disease_dict)
                    #exit()
                    disease_dict = str(disease_dict).replace("'", '"')
                    with open("disease_data", 'a', encoding='utf-8') as f:
                        print(1111)
                        f.write(disease_dict)
                        f.write("\n")
                        f.close()


if __name__ == '__main__':
    ds = Disease_Species()
    ds.run()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值