Python - 如何获取页面Wikipedia会将我重定向到?

时间:2017-11-28 17:33:09

标签: python python-3.x http python-requests url-redirection

我想存储一些不同的维基百科链接,但我不想将两个不同的链接存储到同一页面两次。例如,以下链接不同,但它们指向相同的维基百科页面:

https://en.wikipedia.org/w/index.php?title=(1S)-1-Methyl-2,3,4,9-tetrahydro-1H-pyrido-3,4-b-indole&redirect=no 
https://en.wikipedia.org/w/index.php?title=(1S)-1-methyl-2,3,4,9-tetrahydro-1H-pyrido-3,4-b-indole&redirect=no
__________________________________________________|___________________________________________________________

唯一的区别是一个大写字符。或者以下链接:

https://en.wikipedia.org/wiki/(0,1)-matrix 
https://en.wikipedia.org/wiki/(0,1)_matrix 
___________________________________|______ 

这只是不同的,因为一个人有' - '另一个有' _'('')。所以我想要的只是存储其中一个或以下链接:

https://en.wikipedia.org/wiki/Tetrahydroharman 
https://en.wikipedia.org/wiki/Logical_matrix 

我已经尝试过这个SO question的答案。但它对我没有用。 (结果是我的初始URL,而不是一个wiki将我重定向到浏览器中)所以我怎样才能实现我正在寻找的东西?

3 个答案:

答案 0 :(得分:3)

由于维基百科没有正确的301/302重定向,当您打开链接时会发生正确的200成功响应,然后使用JS更改网址

我提出了一个快速可行的解决方案。首先,从网址

中删除&redirect=no
In [42]: import requests

In [43]: r = requests.get('https://en.wikipedia.org/w/index.php?title=(1S)-1-Met
    ...: hyl-2,3,4,9-tetrahydro-1H-pyrido-3,4-b-indole')

In [44]: tmp = r.content.replace('<link rel="canonical" href="', 'r@ndom}-=||').
    ...: split('r@ndom}-=||')[-1]

In [45]: idx = tmp.find('"/>')

In [46]: real_link = tmp[:idx]

In [47]: real_link
Out[47]: 'https://en.wikipedia.org/wiki/Tetrahydroharman'

真实的网址值存储在<link rel="canonical" href="代码中。

你可以使用上面的方法,这对你的用例来说足够好,或者你可以使用像bs4这样的库来解析页面并获取链接或使用正则表达式提取链接。

答案 1 :(得分:0)

您可以使用MediaWiki API获取重定向的目标网页

结果可以是JSON格式(例如)

您需要的只是解析它以获取元素的值或元素 title

此查询将检索&#39; Halab&#39;:

的目标网页

https://en.wikipedia.org/w/api.php?action=query&titles=Halab&&redirects&format=json

结果:

<root>
   <fac/>
   <pac>
      <sec>a</sec>[1]<sec>b</sec>[2]</pac>
   <pac>
      <sec>c</sec>[3]<sec>d</sec>[4]</pac>
   <sec>e</sec>[5]</root>

在Python中:

{  
   "batchcomplete":"",
   "query":{  
      "redirects":[  
         {  
            "from":"Halab",
            "to":"Aleppo"
         }
      ],
      "pages":{  
         "159244":{  
            "pageid":159244,
            "ns":0,
            "title":"Aleppo"
         }
      }
   }
}

答案 2 :(得分:0)

Amit Tripathi的答案引发异常。这是我的答案:

res = requests.get(url)
doc = lxml.html.fromstring(res.content)
for t in doc.xpath("//link[contains(@rel, 'canonical')]"):
    new_url = str(t.attrib['href'])

根据我的经验,可能会重定向到相同的URL。因此最好在使用new_url之前检查(url!= new_url)。