首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python从维基百科的Infobox中获取文本

用Python从维基百科的Infobox中获取文本
EN

Stack Overflow用户
提问于 2019-08-01 09:48:45
回答 1查看 329关注 0票数 0

想要获取https://en.wikipedia.org/wiki/Air_Alg%C3%A9rie的infobox内容

我跟踪了this article

代码语言:javascript
复制
import requests 
from lxml import etree 

url='https://en.wikipedia.org/wiki/Air_Alg%C3%A9rie'

req = requests.get(url)  

store = etree.fromstring(req.text) 

# this will give Motto portion of above  
# URL's info box of Wikipedia's page 
output = store.xpath('//table[@class="infobox vcard"]/tr[th/text()="Destinations"]/td/i')  

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

但它是空的

即使req.text存在,也会返回null。我怎样才能得到这个infobox的内容?尤其是,

国际航空运输协会国际民航组织

阿达

我需要国际航空运输协会和国际民航组织的代码。请帮帮忙。

还要记住,DBPedia与维基百科不是实时同步的,在维基百科版本和DBPedia中的相应条目之间可能会有几个月的延迟。我不想要DBPedia内容。

EN

回答 1

Stack Overflow用户

发布于 2019-08-01 12:20:45

要获得AHDAHAIR ALGERIE,您可以使用

代码语言:javascript
复制
xpath( '//td[@class="nickname"]' ) 

至于您的xpath:在这个HTML中,<table><tr>之间有<tbody>,所以您必须在xpath中使用它

代码语言:javascript
复制
'//table[@class="infobox vcard"]/tbody/tr[th/text()="Destinations"]/td'

或者使用//,即使在<table><tr>之间有更多的标签,它也可以工作

代码语言:javascript
复制
'//table[@class="infobox vcard"]//tr[th/text()="Destinations"]/td'

我还跳过了最后的<i>,因为行"Destinations"没有使用<i>

代码语言:javascript
复制
import requests 
from lxml import etree 

url='https://en.wikipedia.org/wiki/Air_Alg%C3%A9rie'

req = requests.get(url)  
store = etree.fromstring(req.text) 

output = store.xpath('//td[@class="nickname"]')  
for x in output:
    print(x.text.strip())

#output = store.xpath('//table[@class="infobox vcard"]//tr[th/text()="Destinations"]/td')
output = store.xpath('//table[@class="infobox vcard"]/tbody/tr[th/text()="Destinations"]/td')
print(output[0].text) 

结果

代码语言:javascript
复制
AH
DAH
AIR ALGERIE
69

编辑:

我使用另一个xpath获取名称"IATA""ICAO""Callsign",然后使用zip()将它们与"AH""DAH""AIR ALGERIE"分组

代码语言:javascript
复制
import requests 
from lxml import etree 

url='https://en.wikipedia.org/wiki/Air_Alg%C3%A9rie'

req = requests.get(url)  
store = etree.fromstring(req.text) 

keys = store.xpath('//table[@class="infobox vcard"]//table//tr[1]//a')
#for x in keys:
#    print(x.text.strip())

values = store.xpath('//td[@class="nickname"]')  
#for x in values:
#    print(x.text.strip())

some_dict = dict()

for k, v in zip(keys, values):
    k = k.text.strip()
    v = v.text.strip()
    some_dict[k] = v
    print(k, '=', v)

print(some_dict)

结果:

代码语言:javascript
复制
IATA = AH
ICAO = DAH
Callsign = AIR ALGERIE

{'IATA': 'AH', 'ICAO': 'DAH', 'Callsign': 'AIR ALGERIE'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57300860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档