- Xpath
表达式 | 描述 |
---|---|
nodename | 选中该元素 |
/ | 从当前节点选取直接的子节点 |
// | 选择文档中的节点,不考虑他们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
text() | 选取文本 |
last() | 选取最后一个节点 |
//li[@class=‘xx’] | 选取符合条件的节点 |
from lxml import etree
import requests
res = requests.get("http://xxxxxxx")
html = etree.HTML(res.content)
result = html.xpath("//li/a/@href)
如果某个属性有多个值得话,可以输用contains()函数选取,第一个参数传入属性名,第二个参数传入属性包含的属性值,就可以匹配到了
from lxml import etree
text = "<li class="li li-first”><a href=” link html first item</a></li> "
res = etree.HTML(text)
result = res.xpath(//li[contains(@class, "li")/a/text()])
- Beautiful Soup
from bs4 import BeautifulSoup as bs
text = "<p class="one">文本</p>"
# 创建BeautifulSoup对象
soup = bs(text, "lxml") # 第二个参数是选择用哪个解析器,这里使用lxml
print(soup.p.string)
print(soup.p.attrs) # 打印第一个p标签所有的属性,是一个字典类型
print(soup.p["class"]) # 也可以直接打印p标签的某个属性
在定义文本的时候,只有一个p标签,对于不标准的HTML字符串,在初始化BeautifulSoup对象的时候会自动补全更正格式,然后调用soup.p.string,输出p节点的文本内容,soup.p可以选出HTML中的p节点,在调用string属性就可以得到文本内容(这种选择方式只会选择匹配到的第一个节点,后面的都会忽略)
from bs4 import BeautifulSoup as bs
soup = bs(html, "lxml")
print(soup.ul.contents)
print(soup.p.children)
contents属性返回UL标签的所有节点,结果是列表形式,会将UL标签中所有的内容以列表形式返回
chiildren属性也可以得到同样的结果,是生成器类型,使用for循环输出即可
如果要得到所有的子孙节点的话,可以调用descendants属性,返回结果是生成器类型,之后用for循环输出
print(soup.p.descendants)
find_all查询所有符合条件的元素:find_all(name, attrs, recursive, text, **kwargs)
根据节点名查找和根据属性值查找
soup = BeautifulSoup(html, "lxml")
for ul in soup.find_all(name="ul"):
for li in ul.find_all(name="li"):
for a in li.find_all(name="a", attrs={class": "xxx"}):
print(a.string)
传入name参数,值为ul,就是查询ul节点,返回结果是列表类型每个元素是bs.element.Tag类型,在进行嵌套查询,查询其内部的li节点,之后继续查询li中的所有a节点。在查询a节点的时候,加入了attrs参数,他的值是a标签的某个属性,是一个字典类型,可以用来确定定位到这个a,得到的结果也是列表
CSS选择器使用时,调用select()方法传入相应的CSS选择器即可
soup = bs(html, "lxml")
result = soup.select("ul li a.xxx") # CSS选择器查找ul下的li下的class为xxx的a标签
- Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,一个简单的Selenium的使用
from selenium import webdriver
from selenium.webdriver.comon.keys import Keys
import time
driver = webdriver.Chrome() # 声明浏览器对象
driver.get("https://www.baidu.com") # 利用对象打开网址
input = driver.find_element_by_id("kw") # 查找id为kw的元素
input.send_keys("python")
input.send_keys(Keys.ENTER) # 输入python后回车
print(driver.page_source) # 打印操作之后的网页源代码
time.sleep(7)
driver.close() # 等待7秒之后关闭窗口
selenium定位节点
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
input_first = driver.find_element_by_id("q") # 查找id为q的那个节点
input_second = driver.find_element_by_css_selector("#q) # 根据css选择器查找
input_last = driver.find_element_by_xpath("//*[@id='q']") # 根据xpath查找
如果查找的目标在网页中只有一个,那么就可以使用find_element…()方法。如果有多个节点,那么用find_element…()就只能得到第一个节点了。如果要查找多个节点需要用find_elements…()方法,多了一个s
选取京东左侧导航栏的标题和链接
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.jd.com/") # 用浏览器驱动对象请求京东首页
li_list = driver.find_elements_by_css_selector(".JS_navCtn.cate_menu li") # 用css选择器查找这个类下的所有li节点
for li in li_list:
for a in li.find_elements_by_css_by_tag_name("a") # 再查找li下的所有a节点
print(a.text, ":", a.get_attribute("href")) # 打印出当前a节点的内容和获取的属性href
selenium驱动浏览器执行操作,常用的模拟操作有:输入文字时用send_keys()。清空文字用clear(), 点击按钮用click()
driver =webdriver.Chrome()
driver.get("https://www.baidu.com")
put = find_element_by_id("kw") # 查找输入框的id
search = find_element_by_id("su") # 查找"百度一下"的id
put.send_keys("python") # 输入框节点输入文字
put.clear() # 清空输入
put.send_keys("spider") # 再次输入
search.click() # 点击搜索
当网页中有一种节点叫iframe,也就是网页的子页面Frame,Selenium打开网页之后实在父级Frame中,他是不能获取到子Frame里面的节点的,需要使用 switch_to.frame()方法来还到子Frame中,括号中填写frame的id值
driver = webdriver.Chrome()
driver.get("https://mail.qq.com/cgi-bin/loginpage?autologin=n&errtype=1")
driver.switch_to.frame("login_frame") # 请求页面之后使用switch_to.frame切换到子页面
user = driver.find_element_by_id("u") # 查找id为u的节点
pas = driver.find_element_by_id("p") # id为p
login = driver.find_element_by_id("login_button") # id为登陆的
user.send_keys("123456789") # 输入账号
pas.send_keys("xxxxxx") # 输入密码
login.click() # 点击登陆
selenium控制前进和后退
driver.get("https://www.baidu.com")
driver.get("https://www.taobao.com")
driver.get("https://mail.qq.com/cgi-bin/loginpage?autologin=n&errtype=1")
driver.back() # 使用back()控制后退
driver.back()
time.sleep(1)
driver.forward() # 使用forward()前进
操作Cookies
driver.get("https://www.zhihu.com/explore")
print(driver.get_cookies()) # 打印所有Cookies
driver.add_cookies({'name': 'leeee', 'value': 'pig'}) # 添加一条Cookies
print(driver.get_cookies()) # 打印就会发现多了一项新加的Cookies
driver.delete_all_cookies() # 删除所有Cookies
print(driver.get_cookies()) # 为空