爬虫XPath相关
朋友问我有关爬虫代码中xpath的相关问题,没系统学过Python,小学了一下做了一些整理,如有错误欢迎交流!
例3.5
她问我的问题是,横线划出来的地方是怎么得来的?(好问题!)
首先,对于这里的'//span[@class="appellation"]',它实际上是通过查看页面的源代码(HTML结构)得来的。是你想要获取网页内的某些信息,然后通过查看源代码后编写相应XPath表达式从而获取它。
这是网页爬取中常用的一个步骤。以下是具体的过程:
1. 查看页面源代码
在浏览器中查看网页的HTML源代码来确定目标数据的结构和特征。具体步骤如下:
步骤 1:打开目标网页
在浏览器中访问目标网页(代码中给出的URL)。
是这样的。
步骤 2:查看网页源代码
在网页上右键,然后选择查看页面源代码。过程如下:
点击后就会跳转到页面源代码。
步骤 3:找到目标信息
在源码中往下翻,比如你想获取这篇文章的来源和作者,在代码中它是上面这张图中的样子。
2. 确定信息的HTML特征
通过分析HTML结构,可以发现:
来源和作者都在<span>标签中。
这些<span>标签都带有class="appellation"属性。
从而:
要提取来源和作者,我们需要找出所有<span>标签,且其class属性为"appellation"。
3. 编写XPath表达式
根据HTML结构,设计对应的XPath表达式来定位目标信息。
XPath的生成逻辑如下:
//span: 查找所有的<span>标签。
[@class="appellation"]: 筛选出class属性值为"appellation"的<span>标签。
组合在一起://span[@class="appellation"]
上面这段XPath表达式会匹配到两段<span>标签,分别是:
<span class="appellation">来源:《求是》2019/01</span>
<span class="appellation">作者:黄坤明</span>
然后,details就 = [
"来源:《求是》2019/01",
"作者:黄坤明"
]
details[0].text:获取第一段文本内容,即 "来源:《求是》2019/01";
details[1].text:获取第二段文本内容,即 "作者:黄坤明"。
最后打印输出结果就是:
来源:《求是》2019/01
作者:黄坤明
例3.6
跟前一个例子的步骤一样我们打开这个网页以及它的源代码,现在我们想要获取网页上所有书的书名。
分步解析 //ul[@id="div"]/li/a/@title
//ul:查找文档中所有<ul>标签。
[@id="div"]:筛选出id属性等于"div"的<ul>标签。即定位到下面这种结构:
在页面源代码中即这里:
/li:从<ul>标签中查找直接子节点<li>,每个<li>对应一条书籍信息。
/a:查找<li>中的<a>标签。这个<a>是链接标签,包含书籍标题和链接地址。
/@title:提取<a>标签的title属性内容。title属性里就是我们想要的书名。
最终匹配得到的titles数组就是下面这样的。
[
"【书评】早面积累优势区域开放放大的上扬保障",
"从服务生产力中审视中国产业结构转型路径",
...
]
最终的输出就是所有书名:
【书评】早面积累优势区域开放放大的上扬保障
从服务生产力中审视中国产业结构转型路径
...
扩充
你可能还会想问:
刚刚的//span[@class="appellation"]和现在的//ul[@id="div"]/li/a/@title,它们的格式是怎么样的,怎么一会有两个/一会只有一个/,一会是/一会是中括号[],还有@,这些都是什么?
下面有一个总表可以看一下:
比如 /(单斜杠)表示从当前节点开始,查找直接子节点。
例如 /html/body/ul表示查找html下的body,再查找body的直接子节点ul。
而 //(双斜杠)表示从当前节点开始,查找所有后代节点(不限层级)。
例如 //ul表示从文档的任意位置开始,查找所有的<ul>标签。
中括号[]用于筛选节点,指定某些条件或属性值。
例如 //ul表示查找所有<ul>标签。而 //ul[@id="div"]表示只查找id属性等于"div"的<ul>标签。
@用于访问节点的属性。
例如 //a表示查找所有<a>标签。而 //a/@href表示查找所有<a>标签的href属性值。