获取静态网页数据时,可以选择使用xpath,Beautifulsoup来提高工作效率
XPath属于lxml库模块,所以首先要安装库lxml
XPath的使用方法:
首先讲一下XPath的基本语法知识:
四种标签的使用方法
1) // 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。
2) / 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作
3) /text() 获取当前路径下的文本内容
4) /@xxxx 提取当前路径下标签的属性值
5) | 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
6) . 点 用来选取当前节点
7) .. 双点 选取当前节点的父节点
列一个常用的匹配规则://title[@lang='eng']
了解基本规则,动手试试:
>>> html = requests.get("http://bbs.tianya.cn/list-lookout-1.shtml", 'User-Agent').text #构建请求,获取response,这没什么好说的
>>> html = etree.HTML(html)
>>> type(html)
<class 'lxml.etree._Element'>
for all_data_div in all_data_div_list:
etree_obj = etree.HTML(str(all_data_div))
url = etree_obj.xpath('//div[@class="atl-item"]/div/div[2]/span/a/@href')
uid = etree_obj.xpath('//div[@class="atl-item"]/div/div[2]/span/a/@uid')
uname = etree_obj.xpath('//div[@class="atl-item"]/div/div[2]/span/a/@uname')
post_time = etree_obj.xpath('//div[@class="atl-item"]/div/div[2]/span[2]/text()')
content = [content.strip() for content in etree_obj.xpath('//div[@class="bbs-content"]/text()')]
like_num = etree_obj.xpath('//div[@class="atl-reply"]/span[@class="tuijian"]/a/@_count')
replyid = etree_obj.xpath('//div[@class="atl-item"]/@replyid')
reply_list = etree_obj.xpath('//div[@class="ir-list"]/ul/li/span[@class="ir-content"]/text() | //div[@class="ir-list"]/ul/li/p/a[1]/@href | //div[@class="ir-list"]/ul/li/@_userid |//div[@class="ir-list"]/ul/li/@_username|//div[@class="ir-list"]/ul/li/p/span[2]/text()')
print(url,uid,uname,post_time,content,replyid,reply_list)