Python用xpath爬取数据返回空列表解决

笔者以爬取2018年AAAI人工智能顶会论文元数据为例。其中包括标题(title)和摘要(abstract)等字段

前言:

首先需要查看该网页是否可以爬取,通过在URL后加入/robots,txt可以查看。

tbody问题

URL:2018AAAI的第一篇论文元数据页面 页面如下:
Python用xpath爬取数据返回空列表解决_第1张图片

笔者通过谷歌浏览器选取上图红框内容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)

返回结果是一个空列表
Python用xpath爬取数据返回空列表解决_第2张图片
经查询得知原因是:浏览器会对html文本进行一定的规范化,所以会自动在路径中加入tbody,导致读取失败,在此处直接在路径中去除tbody即可。
正确xpath:

data = etree.HTML(html).xpath('//*[@id="content"]/table/tr[4]/td[4]/text()')

②URL问题

URL:2018AAAI的第一篇论文页面
Python用xpath爬取数据返回空列表解决_第3张图片
笔者通过谷歌浏览器选取上图红框内容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
response = requests.get(url)
xml = response.content
data = etree.HTML(xml).xpath('//*[@id="abstract"]/div/text()')

返回结果是一个空列表
1.首先查看是否成功获取了XML
可见成功获取了xml,说明请求服务器成功获得响应。但仔细查看获取的xml发现里面没有相关的摘要和作者相关信息。肯定也就无法通过xpath获取摘要文本。逐步查看xml发现里面有一条URL和请求的URL很相似,点进去发现两个URL是同一个页面。
Python用xpath爬取数据返回空列表解决_第4张图片
发现第二个URL路径中多了一个Paper字段。

'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/viewPaper/16065'

尝试请求第二个URL后发现返回了完整的包含网页摘要、作者标题等信息的XML,遂成功爬取到该网页的摘要。
Python用xpath爬取数据返回空列表解决_第5张图片

补充:

①建议使用requests.content

建议获取请求得到的响应用requests.content返回二进制响应内容,使用requests.text可能会出现编码声明不支持问题

xml = response.content

11

②建议加入请求头(headers)

以模拟浏览器登录

from lxml import etree
import requests
headers = {
    'Cookie':'OCSSID=4df0bjva6j7ejussu8al3eqo03',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
                 ' (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url,headers=headers)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)

获取请求头,使用谷歌浏览器可获取,一般选取User-AgentCookie等字段,使用浏览器登录某个网页时,需要向服务器端发出请求,请求头就包含自己使用的浏览器的相关信息。相关介绍见:百度百科

Python用xpath爬取数据返回空列表解决_第6张图片

你可能感兴趣的:(Python,爬虫,Python,xpath,空列表,爬虫)