XPath中text方法和string方法的用法总结

1 目标

目标网址(丁香园论坛):http://www.dxy.cn/bbs/thread/626626#626626
目标:提取第一个回复的所有内容,如下图所示:
在这里插入图片描述

2. 实战说明

2.1 前期代码准备

import requests # 导入报错的朋友手动安装一下pip install requests
from lxml import etree # 导入报错的朋友手动安装一下pip install lxml

# get_html_text(url)获取网页信息
def get_html_text(url):
    try:
        r = requests.get(url) # 爬取完整的网页数据
        r.raise_for_status() # 如果状态不是200,引发HTTPError异常
        return r.text # 以字符串的形式返回爬取的网页内容
    except:
        print("访问出错")
        return "" # 发生异常,返回空字符串

url = 'http://www.dxy.cn/bbs/thread/626626#626626'
data = get_html_text(url)
# 做好ElementTree
tree = etree.HTML(data)
# 以列表形式,返回所有包含所需信息的td标签
ls = tree.xpath('//td[@class="postbody"]')

n = len(ls) # 统计ls里面有几个元素
print('取到的td标签数:{}'.format(n)) # 输出是4,因为未登录只能抓到4条记录
# 因为第一条是问题,所以第二条才是第一个回复,因此用ls[1]取到
# 下面就是测试语句,展示text()和string的区别了

2.2 text()方法

text()又有两种用法,一种是ls[1].xpath(’./text()’),一种是ls[1].xpath(’.//text()’)。

2.2.1 ls[1].xpath(’./text()’)用法

表示只取当前节点中的文本内容,对于子孙节点的内容不会取。
测试代码:

print('输出取到的文本数目:', end='')
print(len(ls[1].xpath('./text()')))
# 输出取到的文本列表
print("处理前:")
print(ls[1].xpath('./text()'))
# 把列表中的元素合成一个字符串,同时清理组合字符串两端的空格和换行符
print("处理后:")
print('\n'.join(ls[1].xpath('./text()')).strip())

输出结果:

取到的td标签数:4
输出取到的文本数目:4
处理前:
['\n \n 从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。', '贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”', '作者:林文华 任自文 丁燕生', '\n \t ']
处理后:
从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。
贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”
作者:林文华 任自文 丁燕生

在这里插入图片描述

我们发现:td标签的子标签a中的文本内容"http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm"没有被提取出来。

2.2.2 ls[1].xpath(’.//text()’)用法

表示取当前节点及其子孙节点中的文本内容。
测试代码:

print('输出取到的文本数目:', end='')
print(len(ls[1].xpath('.//text()')))
# 输出取到的文本列表
print("处理前:")
print(ls[1].xpath('.//text()'))
# 把列表中的元素合成一个字符串,同时清理组合字符串两端的空格和换行符
print("处理后:")
print('\n'.join(ls[1].xpath('.//text()')).strip())

结果输出:

取到的td标签数:4
输出取到的文本数目:5
处理前:
['\n \n 从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。', '贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”', '作者:林文华 任自文 丁燕生', 'http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm', '\n \t ']
处理后:
从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。
贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”
作者:林文华 任自文 丁燕生
http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm

我们看到输出取到的文本数目:5,之前是4,就是因为把字标签a标签中的文本“http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm”取到了。

2.3 string()方法

string()会把当前节点和所有的子孙节点中的文本全部提取出来,组合成一个字符串。
测试代码:

print('输出取到的文本数目:', end='')
print(len(ls[1].xpath('string(.)')))
# 输出取到的文本列表
print("处理前:")
print(ls[1].xpath('string(.)'))
# 把列表中的元素合成一个字符串,同时清理组合字符串两端的空格和换行符
print("处理后:")
print(ls[1].xpath('string(.)').strip())

输出结果

取到的td标签数:4
输出取到的文本数目:648
处理前:

                                                                                                                                   
                                                                                                    从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”作者:林文华 任自文 丁燕生http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm
                                                                                                                                                                                                                                
处理后:
从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”作者:林文华 任自文 丁燕生http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm

分析结果发现输出的效果没有text()优雅,跟网页预览有差距,连接不同节点的字符串没有加换行符。不过提取的还是很靠谱的。

3. 总结用法

个人感觉string()不够优雅,有点坑,非要写成string(.)的形式,而且还不能在一开始的路径中写,比如:ls = tree.xpath(’//td[@class=“postbody”]/string(.)’)就会报错,而text()就可以。
然后对于text()用’//text()‘还是’/text()'就看你的需求了。
最后放上一波总结的核心代码,以后好直接套用:

# text()的用法
ls = tree.xpath('//td[@class="postbody"]')
'\n'.join(ls[1].xpath('.//text()')).strip()

# string()的用法
ls = tree.xpath('//td[@class="postbody"]')
ls[1].xpath('string(.)').strip()

4. 参考资料

  1. 解决:xpath取出指定多标签内所有文字text

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
每日学一技

### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 70 面 0 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2: 使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值