selector库
xpath语法常用规则
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点,而不考虑它们的位置,跨节点获取标签
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
text() 选取文本
可以配合使用.//意思是当前节点所有子孙节点
1、获取标签的xpath路径
2、通过class获取table下的tbody标签的tr列表,获取到的是一个数组(注:前面加.)
3、从数组的第二个开始获取(注:前面加.)
all_trs = response.xpath("//table[@class='forums_tab_table']//tr")[2:]
4、获取tr标签的第二个td标签(注:前面加.)
if tr.xpath(“.//td[1]/span/text()”).extract():
status = tr.xpath(“.//td[1]/span/text()”).extract()[0]
topic_item[“status”] = status
5、获取text,获取到的东西都是数组,所以我们要获取第0个元素(注:前面加.)
create_time = answer_item.xpath(".//label[@class='date_time']/text()").extract()[0]
6、获取a标签里面的href的值(注:前面加.)
next_page = response.xpath("//a[@class='pageliststy next_page']/@href").extract()
7、获取数组的最后一个元素 -1(注:前面加.)
author_id = author_url.split("/")[-1]
8、提取时间格式(注:前面加.)
create_time = tr.xpath(".//td[4]/em/text()").extract()[0]
create_time = datetime.strptime(create_time, "%Y-%m-%d %H:%M")
9、找下一页的url,涉及到递归
last_time_str = tr.xpath(".//td[6]/em/text()").extract()[0]
last_time = datetime.strptime(last_time_str, "%Y-%m-%d %H:%M") // 将字符串转换成时间类型
10、防止报错写法
if tr.xpath(“.//td[1]/span/text()”).extract():
status = tr.xpath(“.//td[1]/span/text()”).extract()[0]
topic_item[“status”] = status
11、区分插入数据还是更新数据
def save(self):
topic = Topic()
topic.title = self[“title”]
topic.content = self[“content”]
topic.id = self[“id”]
topic.author = self[“author”]
topic.create_time = self[“create_time”]
topic.answer_nums = self.get(“answer_nums”, 0)
topic.click_nums = self.get(“click_nums”, 0)
topic.praised_nums = self.get(“praised_nums”, 0)
topic.jtl = self.get(“jtl”, 0)
topic.score = self.get(“score”, 0)
topic.status = self[“status”]
topic.last_answer_time = self[“last_answer_time”]
existed_topics = Topic.select().where(Topic.id == topic.id)
if existed_topics:
topic.save()
else:
topic.save(force_insert=True)
12、记住.//和//是不一样的,为了防止错误,我们全部都要使用.//
13、数字和文本混合在一起,我们应该怎么把数字提取出来呢
jtl_match = re.search("(\d+)%", jtl_str)
if jtl_match:
jtl = int(jtl_match.group(1))
14、获取div标签,并且是以id的值以post-开头
all_divs = response.xpath("//div[starts-with(@id, 'post-')]")
<div id="post-123214243"></div>