爬虫之css选择器、xpath选择器、正则 三种提取数据方法的用法
css选择器、xpath选择器、正则三种提取数据的用法:
Xpath选择器的用法:
路径表达式 | 结果 |
---|---|
/ | 从根目录开始 必须具有严格的父子关系 |
// | 从当前标签 后续节点含有即可选出 |
* | 通配符,匹配任何元素节点。 |
//div/book[1]/title | 选择div下第一个book标签的title元素 |
//div/book/title[@lang=‘zh’] | 选择title属性的含有lang且内容是zh的title元素 |
//div/book/title //book/title | 具有相同的结果,因为使用相对路径最终都指向title |
//book/title/@* | 将title所有属性值选择出来 |
//book/title/text() | 将title的内容选择出来。 |
//a[@href=“link1.html” and @id=“places_neighbours_row”] | 将符合这两种数据的所有a标签选出来 |
//div/book[last()]/title/text() | 将book最后一个元素选出 |
//div/book[price>39]/title | 将book子标签price数值大于39的选择出来 |
//li[starts-with(@class,“item”)]/a/text() | 将class属性前缀是item的li标签选出来 |
//title[contains(@lang,‘eng’)] | 将title属性lang含有eng关键字的标签选出 |
CSS选择器用法:
路径表达式 | 结果 |
---|---|
a.home | 选择class=home的标签 |
a#game | 选择id= game 的标签 |
a >span | 选择标签的所有子标签span |
a span | 选择标签的所有 标签span |
详细参考链接(菜鸟css教程):http://www.runoob.com/cssref/css-selectors.html
正则的用法:
下面就进行实战练习:
第一种:lxml.html 提取数据
例如提取下面图片中的面积:
# 首先requests.get发出请求
response=requests.get('http://example.webscraping.com/places/default/view/China-47')
content= response.text
1、正则
# 下面两种正则匹配都可以
res = re.compile(r'Area: </label></td><td class="w2p_fw">(.*?) square kilometres</td>')
# res = re.compile(r'<tr id="places_area__row">.*?<td class="w2p_fw">(.*?)</td>')
results = res.findall(content)[0]
print(resluts)
2、xpath选择器
tree = lxml.html.fromstring(result)
html_data = tree.xpath('//tr[@id="places_languages__row"]/td[@class="w2p_fw"]/text()')
3、css选择器
tree = lxml.html.fromstring(result)
td=tree.cssselect('tr#places_languages__row>td.w2p_fw')[0]
上面三种方法都可以得到Area的内容,其他的可以练习一下获取其他内容,使用这三种方法。
下面图片是我使用xpath对这个链接其他内容的提取:可以自己尝试一下
2、第二种:selenium 提取数据方法:
selenium主要是一种模拟游览器的自动化方法,可以自动进行一系列动作,比如百度:进去百度页面–》自动输入搜索的内容----》自动搜索
这个需要下载安装一下geckodriver插件:https://blog.****.net/hy_696/article/details/80114065
# 需要导入的包
import time
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FOptions
from selenium.webdriver.common.action_chains import ActionChains
# executable_path='D:/geckodriver.exe' 这个里面写的是你geckodriver.exe的绝对路径,根据自己而定
options = FOptions()
brower=webdriver.Firefox(executable_path='D:/geckodriver.exe',firefox_options=options)
# 以百度为例子
brower.get('https://www.baidu.com')
input_element = brower.find_element_by_id('kw')
input_element.send_keys('iPhone')
time.sleep(3)
# css选择器方法
#button=brower.find_element_by_id('su')
# xpath选择器方法
button = brower.find_elements_by_xpath('//input[@id="su"]')[0]
button.click()
time.sleep(10)
# brower.close()
这个方法就是首先进入到百度页面,然后右键检查元素,找到输入框 input的id,或者是代表唯一的它的属性就可以,同理找到百度一下这个button按钮,之后click()就ok了。
3、scrapy框架里面使用response提取数据:
如果对scrapy框架了解不深的可以阅读一下该教程:http://www.scrapyd.cn/doc/178.html
css提取方法:http://www.scrapyd.cn/doc/185.html
xpath提取方法:http://www.scrapyd.cn/doc/186.html