在使用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()