文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 网络抓取和文本挖掘 - 3

2023-01-31 06:09

关注

XPath 是一种查询语言,用于在HTML/XML文档中定位和提取一些片段。XPath也是一个W3C标准。XPath只能处理DOM,所以必须先将HTML或XML文档加载解析成DOM。在Python中可以用lxml保的etree来 执行DOM解析和XPath查询。

1. 示例文件

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title>Collected R wisdoms</title>
</head>

<body>
<div id="R Inventor" lang="english" date="June/2003">
  <h1>Robert Gentleman</h1>
  <p><i>'What we have is nice, but we need something very different'</i></p>
  <p><b>Source: </b>Statistical Computing 2003, Reisensburg</p>
</div>

<div lang="english" date="October/2011">
  <h1>Rolf Turner</h1>
  <p><i>'R is wonderful, but it cannot work magic'</i> <br><emph>answering a request for automatic generation of 'data from a known mean and 95% CI'</emph></p>
  <p><b>Source: </b><a href="https://stat.ethz.ch/mailman/listinfo/r-help">R-help</a></p>
</div>

<address><a href="http://www.r-datacollectionbook.com"><i>The book homepage</i><a/></address>

</body> </html>

2. 文件的DOM结构


3. xpath路径

对于HTML文档 ,可以用到达该节点的顺序来描述它的位置,如示例文件中<i>元素,它的XPath为"/html/body/div/p/i",提取该文档<i>节点数据,这个是绝对路径,可以匹配到两条数据;另外可以使用相对路径,如"//i" 这样可以匹配到三条数据,//表示可以从某个路径开始,这条相对路径效率比较低,会导致对文档树进行完全遍历。python代码如下:

f = open("fortunes.html", "r")
    content = f.read()
    f.close()
    html = et.HTML(content)

    elements = html.xpath('/html/body/div/p/i')
    for ele in elements:
        print ele.text

    print ""
    
    elements = html.xpath('//i')
    for ele in elements:
        print ele.text

4. 用节点关系构建XPath

利用这个特性构建XPath的语法为:node1/relation::node2,同样上述html文档,用这个语句就可以构造一个XPath来提取第2个<div>下的<i>元素。

语句为:  //a/acenstor::div//i 表示这条路径中的i是一个div后代,同时这个div又是一个a的祖先,从文档树的结构看,只有第2个div具备这个特性。

XPath 轴用来表示的节点与上下文节点之间的关系,如图所示。


4. XPath谓语

谓语是能针对节点的名字、值或属性进行调用的简单函数,这些函数会对某个条件 (或一组条件)是true还是false进行判断。结果为true的那些节点会被选中。

XPath谓语的语法:node[predicate]



数字谓语,利用文档中的数字属性,如计数或位置,创建条件语句,如:'//div/p[position()=1]’  返回第一个位置的<p>

文本谓语,根据文档中元素的名字、内容、属性或属性值中的文本选取节点,如 '//div[@date="october/2011]"'

5. 提取节点元素

   在python中用lxml可以方便的获得元素的标签名、内容t和属性,分别对应的是lxml.etree._Element类的tag、text属性和items()方法。

if __name__ == '__main__':
    f = open("fortunes.html", "r")
    content = f.read()
    f.close()
    html = et.HTML(content)

    elements = html.xpath('//')
    for ele in elements:
        print type(ele)
        print ele.tag
        print ele.items()

此外,关于正则表达式、http、sql和ajax的相关知识就跳过,这些以前都接触过。










阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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