【问题标题】:How to extract data from the infobox of a wikipedia page?如何从维基百科页面的信息框中提取数据?
【发布时间】:2018-10-21 12:10:00
【问题描述】:

我的目标是从维基百科page of Microsoft 的信息框中提取“成立”和“产品”信息。我正在使用 python 3,我使用了我在网上找到的以下代码,但它不起作用

# importing modules 
import requests 
from lxml import etree 
# manually storing desired URL 
url='https://en.wikipedia.org/wiki/Microsoft'

# fetching its url through requests module   
req = requests.get(url)  

store = etree.fromstring(req.text) 

# trying to get the 'Founded' portion of above  
# URL's info box of Wikipedia's page 
output = store.xpath('//table[@class="infoboxvcard"]/tr[th/text()="Founded"]/td/i')  

# printing the text portion 
print output[0].text   

#Expected result:
 Founded:April 4, 1975; 43 years ago in Albuquerque, New Mexico, U.S.

【问题讨论】:

标签: python web-scraping extract wikipedia


【解决方案1】:

使用了不正确的 Xpath。我从问题中提供的 Wikipedia 页面检索到元素的正确 XPath。我还为 Python 3 兼容性添加了括号打印语句。

试试:

# importing modules
import requests
from lxml import etree
# manually storing desired URL
url='https://en.wikipedia.org/wiki/Microsoft'

# fetching its url through requests module
req = requests.get(url)

store = etree.fromstring(req.text)

# an incorrect xpath was being used
output = store.xpath('//*[@id="mw-content-text"]/div/table[2]/tbody/tr[7]/td')

# added parenthesis python 3 
print (output[0].text)

我明白了:

April 4, 1975

【讨论】:

  • 也许会更详细地说明您为什么导入您导入的模块以及您提出的解决方案的细节。看起来您可能有想要的答案,但它只是代码 - 代码答案可能会有所帮助,但通常对于这个问题的未来观众来说缺乏任何持久的意义。
  • @BrandonBuck 他只是修改了OP的代码,所以他没有自己添加任何导入。这个问题非常具体,所以我认为让答案比问题更广泛没有意义。如果有人想从网络抓取开始,我认为有很多比这个问题更好的起点。
  • @Dluzak SO 是一个问答网站,我会告诉你的。对一个问题有一个具体的答案并称之为一天是有价值的。但是,这个问题(除非已删除)将一直存在,直到它从 SO 数据库中删除(如果它们关闭,或出现某种故障等......)。鉴于此,许多人可能会来这里寻求他们问题的答案。也许是确切的具体问题,也许是一个非常相关的问题。如果他们在这里没有找到答案,或者在这里没有学到任何东西——他们会在我们现在可以帮助他们的时候提出一个新问题。因此,纯代码的答案并没有尽可能有用。
  • @BrandonBuck 我同意一些关于 xpath 出了什么问题的评论,他改变了什么以及为什么改变肯定会增加这个答案的价值。但我认为关于导入模块的 cmets 在这里是一个题外话。对于网络抓取新手来说,还有很多更好的地方,例如 this questionthis articlethis question
  • BrandonBuck @Dluzak 我相应地编辑了我的答案。我希望这已经足够了。这是我在网站上的第一篇文章。我有很多学习要做。 Dluzak 是对的,我只是编辑了 OP 的原始代码。
【解决方案2】:

您可能应该使用mwparserfromhell 尝试自行解析mediawiki 标记是……尝试。使用mwparsefromhell,您可以过滤掉模板,然后提取它们的各个参数。

code = mwparserfromhell.parse(text)
for template in code.filter_templates():
    if template.name.matches("infobox"):
       for p in template:#...

https://github.com/earwig/mwparserfromhell

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 2016-08-04
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2020-02-02
    • 2022-01-12
    • 2019-09-15
    相关资源
    最近更新 更多