- 1 min

爬虫基础之网页解析

Table of Contents

BeautifulSoup

简介

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。

安装

 pip3 install beautifulsoup4

文档读取

 # url 请求获取文档
 import requests
 from bs4 import BeautifulSoup
 response = requests.get("http://www.baidu.com")
 content = response.content
 soup = BeautifulSoup(content, 'html.parser')

 #本地文档
 soup = BeautifulSoup(open('index.html'))
 print(soup)

常用方法

 #根据 tag 查找
 soup.a 	#返回第一个 a 标签

 #find() & find_all()
 soup.find('div', class_='cat')	# 查找第一个class='cat'的div
 soup.find_all('div', class_='cat') # 查找全部class='cat'的div

 #select 方法
 soup.select('div ul p') #查找 div 下 ul 下的多个 p 标签

 #正则查找
 html_doc = """
 <td>
     <img src="https://morvanzhou.github.io/static/img/course_cover/tf.jpg">
 </td>
 """
 img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')})	#
 #参考:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id28

Xpath

简介

简单说,xpath就是选择XML文件中节点的方法。所谓节点(node),就是XML文件的最小构成单位,一共分成7种。

 - element(元素节点)
 - attribute(属性节点)
 - text (文本节点)
 - namespace (名称空间节点)
 - processing-instruction (处理命令节点)
 - comment (注释节点)
 - root (根节点)

xpath 表达式规则

1.基本格式

 - 斜杠(/)作为路径内部的分割符。
 - 同一个节点有绝对路径和相对路径两种写法。
 - 绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。
 - 相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。
 - "."表示当前节点。
 - ".."表示当前节点的父节点

2.节点选择规则

 - nodename(节点名称):表示选择该节点的所有子节点
 - "/":表示选择根节点
 - "//":表示选择任意位置的某个节点
 - "@": 表示选择某个属性

路径表达式及其表达式的结果

 /bookstore/book[1]			#选取属于 bookstore 子元素的第一个 book 元素
 /bookstore/book[last()]	#选取属于 bookstore 子元素的最后一个 book 元素
 /bookstore/book[last()-1]	#选取属于 bookstore 子元素的倒数第二个 book 元素
 /bookstore/book[position()<3]	#选取最前面的两个属于 bookstore 元素的子元素的 book 元素
 //title[@lang]				#选取所有拥有名为 lang 的属性的 title 元素
 //title[@lang=’eng’]		#选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
 /bookstore/book[price>35.00]	#选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00
 /bookstore/book[price>35.00]/title	#选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00

Demo

from lxml import etree
html = etree.parse('index.html')
a = html.xpath('//li/a')
print(a[0].text)
Topaz

Topaz

Always keep learning.

comments powered by Disqus
rss facebook twitter github youtube mail spotify instagram linkedin google pinterest medium vimeo