【问题标题】:why xpath derived from chrome does not work为什么从chrome派生的xpath不起作用
【发布时间】:2017-08-22 18:21:51
【问题描述】:

我正在尝试从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 对于这两个页面是相同的。

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

【问题讨论】:

  • 你可以尝试更具体的xpath表达式(//div[@class="block-record-info"])[2]/p/text()
  • @vold 抱歉,您能再解释一下吗?我不太明白。

标签: python google-chrome xpath web-scraping


【解决方案1】:

给定完整 Xpath 的浏览器通常是 unhelpful,您应该使用基于属性(例如 id、class 等)或任何识别特征(例如 contains(@href, 'image'))的相对和智能的。

您可以尝试更具体的 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)

输出:

【讨论】:

  • 非常感谢。虽然它确实适用于您的情况,但是如果我复制并运行您的代码,我仍然会得到一个空列表,r.status_code 给出200。我在 Chrome 中打开 url,它显示 Invalid query。请检查时间跨度是否在所选数据库的覆盖范围内。您知道出了什么问题吗?
  • 我尝试使用另一个链接,我只是从数据库中最近的搜索中复制它并且它有效。所以可能是由于时差..
  • 现在它给了我同样的回应:Invalid query. Please check that the timespan is within the selected database\'s coverage. 但如果另一个链接工作正常,那就无关紧要了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2012-03-07
  • 2012-10-04
相关资源
最近更新 更多