文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在xpath中text()和string(.)的区别有哪些

2023-06-02 03:50

关注

这篇文章将为大家详细讲解有关在xpath中text()和string(.)的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  我们在进行爬虫时候,经常会遇到如下这样的页面:

  你好,北京

  在日常抓取的时候,遇到更多的情况是抓取中的你好,这时使用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(.)")即可。):

在xpath中text()和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:

  你好,北京

关于“在xpath中text()和string(.)的区别有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯