接着上次的1.0接着说,1.0里只是爬取了第一页,如果我想爬取第二页,第三页呢?当然是用循环喽。
代码如下:
for i in range(1,10):
url = "http://apps.webofknowledge.com/summary.do?product=UA&parentProduct=UA&search_mode=GeneralSearch&parentQid=&qid=34&SID=8EVHgmFwQyO7vUv8d9U&&update_back2search_link_param=yes&page=%d\"%i\n",
"
html = etree.HTML(get_HTML(url))"
names= html.xpath('//div/a[@class=\"smallV110 snowplow-full-record\"]/value[@lang_id="" or @lang_id="en"]')
for name in names:
with open("title.txt","a",encoding='utf-8') as f:
f.write(name.xpath('string(.)').strip()+"\n")
f.close
我在爬取第二页的时候,发现有的文献题目可能有两个,因为文章不是用全部英文写的所以题目就有一个原题目和英文题目。正常来说每页会有10篇文章的题目,但是现在加上别的语言写的题目,会匹配到超过10个题目。我现在只想要英文题目,怎么办?
这时候,再次按下F12,审查。发现,对于英文题目,lang_id这个属性有两个值,默认是英文的,就是“”,有多个题目的,就是"en",因此只要把属性值是这两个值的文本找出来就行了。
1.html.xpath('//div/a[@class="smallV110 snowplow-full-record"]/value[contains(@lang_id,"", "en")]')"
2.html.xpath('//div/a[@class="smallV110 snowplow-full-record"]/value[@lang_id="" or @lang_id="en"]')"
猜猜那种是对的?
答案是第二种。为什么第一种不对呢?因为contains的意思是包含,包含是有,但现在我要的是有且仅有。在contains里,"en"中就包含了"",这当然不是我要的结果了
好了,这样就实现了一次性读取多页题目的功能了,结果如下: