打开Python爬虫练习页面随机CSS样式类名,无Element ID_N07_Spiderbuf,可以看到页面数据并不复杂。
在网页上点击右键 > 显示网页源代码,可以看到网页结构也并不复杂。源码第16 - 29行有CSS样式代码,根据提示应该就是这里会变化,直接在源码的页面上刷新,可以看到CSS的类名发生了变化,而且每刷新一次都会变。
往下翻看源码,可以看到源码第70 - 1436行就是我们需要爬取的内容,div对应的CSS类名也会随刷新页面变化。
因为CSS类名每次都是随机的,就很难像之前那样直接使用XPath定位到需要获取的内容进行解析了,这时候有两种方法:一个就是requests.get获取到网页内容后先解析出当前的CSS类名,然后组装XPath表达式解析内容;第二就是使用相对位置来获取内容。
这里我们使用第二种方法,通过浏览器开发者工具(F12)找到目标内容上一层的div,然后复制XPath路径,复制出来的内容如下:
/html/body/main/div[2]
我们的目标就是以上XPath路径下的所有div,所以最终使用的XPath表达式如下:
/html/body/main/div[2]/div
把以下XPath表达式嵌入到python代码中并输出,就能够看到我们想要获取到的内容。
# 取页数
html_bytes = requests.get(base_url, headers=my_headers).content
html = html_bytes.decode()
root = etree.HTML(html)
# print(html)
divs = root.xpath('/html/body/main/div[2]/div')
for div in divs:
print(div.text)
此时就可以通过每道题目的序号等标识处理成完整的有序内容。
完整的示例代码:示例代码