2017-07-03 4 views
2

Ich habe einen Web-Scraping-Code, der keine Tabelle finden kann. Mein Code sieht so aus:Python Schöne Suppe kann Tabelle nicht finden

site = 'http://etfdb.com/compare/market-cap/' 
hdr = {'User-Agent': 'Mozilla/5.0'} 
req = Request(site, headers=hdr) 
page = urlopen(req) 
soup = BeautifulSoup(page) 
table = soup.find('table', {"class":"table mm-mobile-table table-striped 
table-bordered"}) 

Die Tabellen HTML wie folgt aussieht:

<table class="table mm-mobile-table table-striped table-bordered" data- 
icons-prefix="fa" data-icons="{&quot;columns&quot;:&quot;fa-th&quot;}" data- 
striped="true" data-toggle="table"> 

aber aus irgendeinem Grund immer mein Code-Tabelle, da keine zurückgibt. Ich weiß nicht warum, aber jede Hilfe wäre willkommen. Vielen Dank.

+0

Es gibt keine Tabellen in der 'soup' (noch im' page'). Wahrscheinlich erkennt der Server 'Mozilla/5.0' nicht als gültigen Agenten. – DyZ

Antwort

3

Das Problem ist, dass es eine falsche Markup große Teile des Codes zu machen, kommentierte heraus d.h

<!-->. 

das Update war diese Elemente dann analysieren, um die HTML zu ersetzen.

from urllib2 import urlopen, Request 
from bs4 import BeautifulSoup 
site = 'http://etfdb.com/compare/market-cap/' 
hdr = {'User-Agent': 'Mozilla/5.0'} 
req = Request(site, headers=hdr) 
res = urlopen(req) 
rawpage = res.read() 
page = rawpage.replace("<!-->", "") 
soup = BeautifulSoup(page, "html.parser") 
table = soup.find("table", {"class":"table mm-mobile-table table-striped table-bordered"}) 
print (table) 

auf Python Getestet 2.7.12

from urllib.request import urlopen, Request 
from bs4 import BeautifulSoup 
site = 'http://etfdb.com/compare/market-cap/' 
hdr = {'User-Agent': 'Mozilla/5.0'} 
req = Request(site, headers=hdr) 
res = urlopen(req) 
rawpage = res.read().decode("utf-8") 
page = rawpage.replace('<!-->', '') 
soup = BeautifulSoup(page, "html.parser") 
table = soup.find("table", {"class":"table mm-mobile-table table-striped table-bordered"}) 
print (table) 

Getestet auf Python 3.5.2

Gibt:

<table class="table mm-mobile-table table-striped table-bordered" data-icons='{"columns":"fa-th"}' data-icons-prefix="fa" data-striped="true" data-toggle="table"><thead><tr><th class="show-td" data-field="symbol">Symbol</th> <th class="show-td" data-field="name">Name</th> <th class="show-td" data-field="aum">AUM</th> <th class="show-td" data-field="avg-volume">Avg Volume</th></tr></thead><tbody><tr><td class="show-td" data-th="Symbol"><a href="/etf/SPY/">SPY</a></td> <td class="show-td" data-th="Name"><a href="/etf/SPY/">SPDR S&amp;P 500 ETF</a></td> <td class="show-td" data-th="AUM">$236,737,519.17</td> <td class="show-td" data-th="Avg Volume">73,039,883</td></tr> <tr><td class="show-td" data-th="Symbol"><a href="/etf/IVV/">IVV</a></td> <td class="show-td" data-th="Name"><a href="/etf/IVV/">iShares Core S&amp;P 500 ETF</a></td> <td class="show-td" data-th="AUM">$115,791,603.10</td> <td class="show-td" data-th="Avg Volume">3,502,931</td></tr> ... 
+0

Dieser hat funktioniert. Vielen Dank! – Bruno

0

Sie müssen angeben, was genau Sie

soup = BeautifulSoup(page, 'html.parser') 

Dann können Sie sehr gut überprüfen analysieren wollen, wenn es richtig

print(soup.prettify()) 
0

Ich weiß nicht, vielleicht analysiert es ist, weil ihr Code nicht ist gut strukturiert [absichtlich] und BeautifulSoup konnte es nicht analysieren. Aber vielleicht hilft Ihnen:

import re # to extract table with regex 
table_soup = BeautifulSoup(re.findall(r'<table.*>.*</table>', page.read())[0]) 

Sie können auch weiter wie diese mit etwas untersuchen:

for tag in soup.find_all(): 
    if tag.name == 'div': 
     if str(tag).find("table-striped") > -1: 
     print repr(str(tag)[:100]) 

Um zu sehen, welche div Tags die table enthalten, falls vorhanden:

'<div class="mm-header">\n<div class="container">\n<div class="row">\n<div class="col-xs-12">\n<div class' 
'<div class="container">\n<div class="row">\n<div class="col-xs-12">\n<div class="mm-user-links hidden-x' 
'<div class="row mm-header-content">\n<div class="col-sm-4 mm-header-logos">\n<button class="navbar-tog' 
'<div class="col-sm-4 mm-header-logos">\n<button class="navbar-toggle">\n<span class="fa fa-bars"></spa' 

So Ich denke, BeautifulSoup konnte das letzte in Kind-Tags nicht aufteilen.

Edit:

  1. Sorry, ich page.read() hinzufügen vergessen erste Seite Quelle zu bekommen, wieder die zweite Zeile sehen.

  2. Wenn Sie regex nicht verwenden mögen, können Sie einen besseren Parser verwenden eher als der Standard: html5lib

Zuerst installieren Sie es:

# pip install html5lib

Sie können es verwenden:

soup = BeautifulSoup(page, 'html5lib')