这次主要是对 XPath、BeautifulSoup 和 re(正则表达式)三种网页解析方式进行总结。
XPath表达式
首先来看XPath表达式。维基百科中对XPath表达式的解释是,最常见的XPath表达式是路径表达式(XPath这一名称的另一来源)。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这里可以以一个树形结构来理解。来查看浏览器网页代码,按下 F12 可以查看网页,这里以百度搜索首页为例进行分析。常用的两种方法可以直接复制 XPath 也可以自己手动选择路径。
Copy XPath
可以通过右键标签,依次选择 Copy-Copy XPath 对标签路径进行复制,如下图
可以得到标签路径:
//*[@id="u_sp"]/a[2]
手动选择路径
在手动选择之前,先了解一下 XPath 语法。下面用一个列表简单展示一下语法及其用法。这里需要用到一个插件可能更加方便地去查找路径:XPath Helper 或者 极简插件(Google商店的国内镜像版)
descendant-or-self | 自身引用及子孙节点 | // |
child | 子节点 | / |
attribute | 属性 | @ |
self | 自己 | . |
//tag 可以查找网页中所有的tag节点。在本例中,例如://a 可以查看首页的所有 a 标签,利用 XPath Helper 可以得到标签中的非标签字符内容。这里需要注意的是,当利用 python 进行提取的时候,此种方法提取的是整个 a 标签,如果想提取 a 标签下的所有非标签内容需要在后面加上/text(),即: //a/text() 来进行提取。
/tag 可以查看某节点下的子节点。在本例中,例如://div/a 可以查看所有 div 标签下的 a 标签,这里就不放图来占篇幅了。
tag[@attr="value"] 可以用来通过限定标签属性来更加精确的提取标签,也可以用来提取标签属性的值。例如://div[@id="u_sp"]/a 可以提取属性 id 为 u_sp 的 div 标签下的所有 a 标签,即下图这一条的内容。
另外是 tag/@attr 标签在提取标签属性的值上的用法,例如://div[@id="u_sp"]/a/@href 可以提取属性 id 为 u_sp 的 div 标签下的所有 a 标签中的 href 属性的值。