您现在的位置是:亿华云 > 热点
在xpath中text()和string(.)的区别
亿华云2025-10-05 04:28:35【热点】3人已围观
简介我们在进行爬虫时候,经常会遇到如下这样的页面:你好,北京在日常抓取的时候,遇到更多的情况是抓取中的你好,这时使用xpath("//div/em/text()")就可以提取到。现在我们考虑下面两种抓取需
我们在进行爬虫时候,区别经常会遇到如下这样的区别页面:
你好,北京
在日常抓取的时候,遇到更多的区别情况是抓取中的你好,这时使用xpath("//div/em/text()")就可以提取到。区别
现在我们考虑下面两种抓取需求:
需求1:我们想要提取“,区别北京”的时候,这个时候该用text(),区别还是区别string(.)?
需求2:提取 “你好,北京”呢?
我们先使用lxml库对页面进行一下初始化(如果你用的是scrapy的xpath选择器,也可以按照以下步骤运行):
from lxml import etree
with open(foo.html,区别 r) as f:
content = f.read().encode(utf8)
page = etree.HTML(content)
这里我们先看一下需求1的解法,也就是区别提取“,北京”:
re = page.xpath("//div/text()")
这里re得到的是一个数组:
这是因为在页面中标签
和之间是有换行符号的,因此使用"//div/text()"后会忽略掉你好,站群服务器区别而剩下"\n",区别“,北京\n”两个元素。
我们取re的区别第二个元素,然后去掉结尾的区别换行符"\n"(如果你使用的是scrapy的xpath,这里re得到的区别可能不是一个数组):
re = re[1].strip()
这个时候得到的re就是我们需要的",北京"了。
现在看一下第二个需求:提取"你好,区别北京":
这里就要求里面的文本也要提取出来了,这时候我们使用string:
re = page.xpath("//div")[0].xpath("string(.)")
这时来看下re的值(同样如果你使用的是scrapy的选择器,scrapy_selector.xpath("//div")返回的结果可能不是一个数组,不过你只要取到结果然后再使用.xpath("string(.)")即可。):

得到的云服务器一整串文本" \n 你好,北京\n "。
看来使用"string(.)"后,xpath会把里的内容也直接提取出来,而不像上面中"text()"那样把都去掉后,再分割成一个数组。这里注意使用string()时候要把string(.)放在一个xpath中,而不是写成"//div/string(.)"这样,否则会抓取不到。
然后,同样的再去除一下两边多余的空格和换行符
re = re.strip()
这个时候re得到就是”你好,北京“啦。
总结: 无锡人流医院 http://www.0510bhyy.com/
通过上述的实验,我们发现xpath里面text()只会取当层节点的文本并按照当层的tag进行分割,组成列表。而string(.)会把当层节点以及当层节点以下的所有文本都提取出来,放在一个字符串变量中。
实例代码:
test.py:
# coding=utf-8
from lxml import etree
import sys
reload(sys)
sys.setdefaultencoding(utf-8)
class Test(object):
def __init__(self):
with open(foo.html, r) as f:
content = f.read().encode(utf8)
self.page = etree.HTML(content)
print self.page
def xpath_text(self):
re = self.page.xpath("//div/text()")
print re
re = re[1].strip()
print re
return re
def xpath_string(self):
re = self.page.xpath("//div")[0].xpath("string(.)")
print re
# 替换换行符等
re = re.strip(re)
print re
return re
if __name__ == "__main__":
t = Test()
assert t.xpath_text() == u",北京"
assert t.xpath_string() == u"你好,北京"
foo.html:
你好,北京
很赞哦!(944)
相关文章
- 为什么大家都选优质域名?到底存在着什么好处?
- 一文带你解读JavaScript的基本用法
- 用HarmonyOS点亮LED - 基于RISC-V Hi3861开发板
- 一个Bug,差点毁灭世界...
- 3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
- 手把手教你规范自己的代码
- 从 Java 9 到 Java 17 之 Java 10
- Node.js 的 Web 框架的 3 个层次,理清了就不迷茫
- 互联网其实拼的也是人脉,域名投资也是一个时效性很强的东西,一个不起眼的消息就会引起整个域名投资市场的动荡,因此拓宽自己的人脉圈,完善自己的信息获取渠道,让自己能够掌握更为多样化的信息,这样才更有助于自己的域名投资。
- 妙用 Drop-shadow 实现酷炫线条光影效果