知识点拾遗 一(xpath)

一个错误解决xpath用法问题的实例

在我记忆更新之前我的做法是这样的

import requests
from lxml import etree
url = "https://editor.csdn.net/md/?not_checkout=1"
headers = {
     
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
         }
html = requests.get(url,headers=headers)
page = etree.HTML(html.text)
content = page.xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div[4]/div/div[1]/div")
print(content)

结果返回为空
解决思路:
先是怀疑代码没有补全,用了pretty_print,但是打印出来的网页代码没有一个中文,说明修正后的代码是字节类型而不是字符串所以再用xpath会报错,这里面的符号是HTML、XML 等 SGML 类语言的转义序列。它们不是”编码“,也就是说我们不能使用utf-8、gbk等编码进行处理,需要使用HTMLParse hhh最后没有解决打印不出来想要结果而问题而且搞得一头乱麻
然后换了网站继续用xpath爬东西,发现有的网站的class是会变的!这就推翻了我之前认为是xpath有问题的想法,出现问题真的是因为我没有写对定位元素的语法…至于之前考虑的源码编码问题,参考别的文章后,发现没有几个人提到这个问题,大都是简单的几行代码,很少有补全代码的操作。如此看来一开始解决问题的思路就全部跑偏了
接着回到刚刚提到的动态元素的定位问题,这种情况只能用相对关系来定位了。动态元素定位
接着,在搞懂返回为空的真正原因后再去爬取试试,结果都能爬取成功。
爬取百度文档时试图过滤掉一些重复的广告数据,不得其门而入,或许这一目标可以放到数据清洗步骤操作。
最后,学习xpath的性价比会很高,在scrapy,selenium等很多地方都会用到,多花时间熟悉是有价值的。

xpath常用

html = requests.get(url,headers=headers)
print(html)

返回表示正常
2

html = requests.get(url,headers=headers)
page = etree.HTML(html.text)
print(page)

返回

<Element html at 0x216c24f1f40>

这不是想要的html文件结果
这其实是以某种方式编码的元素,它类型是lxml.etree._Element
所以要通过方法把它变成html文件


正确做法是

data = requests.get(url).text
html = etree.HTML(data)
print(etree.tostring(html, pretty_print=True).decode('utf-8'))

提到‘utf-8’编码,关于在url加入汉字并编码的做法是这样的

 keyword = input("请输入关键词:")
    keyword = urllib.parse.urlencode({
     "word":keyword})
    response = urllib.request.urlopen("http://baike.baidu.com/search/word?%s" % keyword)

3.xpath语法使用规则

符号 说明
count 计数所选元素

用到再补充

4.没有设置请求头,xpath也会报错
5.Redirecting (302)说明需要登陆cookie,在setting里面设置
cookies可以这么找
方法一

response = requests.get(url,headers=headers)
print(response.cookies)

方法二

requests库详解与cookie操作

待解决的问题

xpath语法搜不到,应该是网页防爬,典型的是豆瓣图片爬取的例子
scrapy设置cookies
学习不求甚解还不记笔记的恶果是巨大的,这篇文章日后还要不断更新

你可能感兴趣的:(xpath)