2016-05-03 12 views
1

Ich benutze BeautifulSoup, um einen bestimmten Text aus Wikipedia's Infoboxen (Einnahmen) zu extrahieren. Mein Code funktioniert, wenn der Umsatztext in einem "a" -Tag ist. Leider haben nicht alle Seiten ihre Einnahmen in einem "a" -Tag aufgelistet. Manche haben ihren Umsatztext beispielsweise nach "span" -Tags. Ich habe mich gefragt, wie der beste/sicherste Weg wäre, den Ertragstext für eine Liste von Unternehmen zu bekommen. Würde ein anderes Tag anstelle von "a" am besten funktionieren? Oder etwas anderes? Danke für Ihre Hilfe.Was ist der beste Weg, um bestimmten Text aus der Wikipedia Infobox mit BeautifulSoup und Listen zu extrahieren?

company = ['Lockheed_Martin', 'Phillips_66', 'ConocoPhillips', 'Sysco', 'Baker_Hughes'] 

for c in company: 
    r = urllib.urlopen('https://en.wikipedia.org/wiki/' + c).read() 
    soup = BeautifulSoup(r, "lxml") 

    rev = re.compile('^Revenue') 
    thRev = [e for e in soup.find_all('th', {'scope': 'row'}) if rev.search(e.text)][0] 
    tdRev = thRev.find_next('td') 
    revenue = tdRev.find_all('a') 

    for f in revenue: 
     print c + " " + f.text 
     break 
+0

Können Sie 2 URL Beispiele zur Verfügung stellen? –

+0

Ja! Es tut uns leid. https://en.wikipedia.org/wiki/Lockheed_Martin, https://en.wikipedia.org/wiki/Phillips_66 – SallyH

+0

In beiden Beispielen ist der Umsatz nicht in einem 'a'-Tag. –

Antwort

2

können Sie versuchen:

from bs4 import BeautifulSoup 
import urllib 
import re 
company = ['Lockheed_Martin', 'Phillips_66', 'ConocoPhillips', 'Sysco', 'Baker_Hughes'] 

for c in company: 
    r = urllib.urlopen('https://en.wikipedia.org/wiki/' + c).read() 
    soup = BeautifulSoup(r, "lxml") 
    for tr in soup.findAll('tr'): 
     trText = tr.text 
     if re.search(r"^\bRevenue\b$", trText): 
      match = re.search(r"\w+\$(?:\s+)?[\d\.]+.{1}\w+", trText) 
      revenue = match.group() 
      print c+"\n"+revenue+"\n" 

Ausgang:

Lockheed_Martin 
US$ 46.132 billion 
Phillips_66 
US$ 161.21 billion 
ConocoPhillips 
US$55.52 billion 
Sysco 
US$44.41 Billion 
Baker_Hughes 
US$ 22.364 billion 

Hinweis: Vielleicht möchten Sie stattdessen Wikipedia API verwenden, d. H .:

https://en.wikipedia.org/w/api.php?action=query&titles=Baker_Hughes&prop=revisions&rvprop=content&format=json