为什么从chrome派生的xpath不起作用

时间:2017-03-29 10:10:14

标签: python google-chrome xpath web-scraping

我正在尝试从web of science

中删除数据

以下是我要与之合作的specific page

以下是我用于提取摘要的代码:

import lxml
import requests

url = 'https://apps.webofknowledge.com/full_record.do?product=WOS&search_mode=GeneralSearch&qid=2&SID=Q1yAnqE4al4KxALF7RM&page=1&doc=3&cacheurlFromRightClick=no'
s = requests.Session()
d = s.get(url)
soup1 = etree.HTML(d.text)

这是我通过Chrome中的副本xpath获得的xpath:

//*[@id="records_form"]/div/div/div/div[1]/div/div[4]/p/text()

所以我试着像这样得到摘要

path = '//*[@id="records_form"]/div/div/div/div[1]/div/div[4]/p/text()'   
print(soup1.xpath(path))

但是,我只是热了一个空列表!然后我尝试了另一种测试xpath的方法。

首先,我将特定页面保存为本地html文件。

with open('1.html','w',encoding='UTF=8') as f:
    f.write(d.text)
f.close()

然后,打开文件

s.mount('file://',FileAdapter())
d = s.get('file:///K:/single_paper.html')
soup2 = etree.HTML(d.text)
soup2.xpath('//*[@id="records_form"]/div/div/div/div[1]/div/div[4]/p/text()')

它给了我想要的摘要!谁能告诉我为什么会这样?

已经当我尝试使用保存本地文件方式执行其他页面的步骤时,它会再次返回一个空列表!

我检查过Chrome给出的xpath对于这两个页面是一样的。

所以有人能告诉我我的代码有什么问题以及如何修复它?

1 个答案:

答案 0 :(得分:1)

给定完整X路径的浏览器通常是unhelpful,您应该根据属性(例如id,class等)或任何识别功能(如contains(@ href,'image'))使用相对和聪明的。 / p>

您可以尝试更具体的xpath表达式:(//div[@class="block-record-info"])[2]/p/text()并重写您的代码:

import requests
from lxml import html

url = 'https://apps.webofknowledge.com/full_record.do?product=WOS&search_mode=GeneralSearch&qid=2&SID=Q1yAnqE4al4KxALF7RM&page=1&doc=3&cacheurlFromRightClick=no'
s = requests.Session()
r = s.get(url)
tree = html.fromstring(r.content)
element = tree.xpath('(//div[@class="block-record-info"])[2]/p/text()')
print(element)

输出:enter image description here