2016-08-01 5 views
-1

Ich habe einen Web-Scraper für eine Website gemacht und ich möchte alle Knotennummern aus einer HTML-Tabelle extrahieren mit .findall oder etwas, das funktioniert, aber ich kämpfe um zu bekommen Ich bekomme ständig Fehler, die ich definitiv nicht in die richtigen Tags setze.versuchen, Daten aus HTML-Code mit Python zu schaben

Kann mir jemand helfen, der HTML-Code ist als

folgt
</div> 

<table class="dataTable" cellpadding="5" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_dgNodes" style="border-collapse:collapse;"> 
    <tr class="header noBreak"> 
     <td>&nbsp;</td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl00','')">Node Name</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl01','')">Description</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl02','')">MAC Address</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl03','')"></a> 
       <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$liNodeRoleHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_liNodeRoleHeader">Node Role</a> 
      </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl04','')">Firmware</a></td><td> 
       <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$lbUptimeHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_lbUptimeHeader">Uptime</a> 
      </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl05','')">Users</a></td> 
    </tr><tr onmouseover="this.className = 'highlightedRow';" onmouseout="this.className = 'normalRow';" onclick="GoToNodePage('522');" style="height:18px;"> 

Ich brauche die Nummer 522 auf der letzten Zeile Code zu extrahieren und zu allen anderen gotonodepage Zahlen, aber ich kann es herausfinden, ist jede Hilfe dankbar . Ich möchte auch die extrahierten Zahlen in eine Liste der späteren Verwendung einfügen.

r2 = s2.get(webpage) 
bsobjswap = BeautifulSoup(r2.content) 

listy = [] 
for link in bsobjswap.findall('tr'): 
    if 'onclick' in link.attrs: 
     listy.append(link) 
print (listy) 

Fehler ist für Link in bsobjswap.findall ('tr'): Typeerror: 'NoneType' Objekt nicht aufrufbar ist

+0

Ihr Code zurückgeben? Die Fehlermeldungen? – polku

+0

Webseite = "mycompanywebsite.com" r2 = s2.get (Homepage) bsobjswap = BeautifulSoup (r2.content) listy = [] für Link in bsobjswap.findall ('tr'): if 'OnClick' in link.attrs: listy.append (link) drucken (listy) – ipmev12

+0

Fehler sind der Standard TypeError: 'NoneType' Objekt ist nicht aufrufbar, offensichtlich, weil der Code falsch ist und ich finde keine Daten – ipmev12

Antwort

-1

so etwas wie dieses Versuchen:

from bs4 import BeautifulSoup 

xml = """<table class="dataTable" cellpadding="5" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_dgNodes" style="border-collapse:collapse;"> 
    <tr class="header noBreak"> 
     <td>&nbsp;</td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl00','')">Node Name</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl01','')">Description</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl02','')">MAC Address</a></td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl03','')"></a> 
       <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$liNodeRoleHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_liNodeRoleHeader">Node Role</a> 
      </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl04','')">Firmware</a></td><td> 
       <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$lbUptimeHeader','')" id="ctl00_ContentPlaceHolder1_dgNodes_ctl00_lbUptimeHeader">Uptime</a> 
      </td><td><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$dgNodes$ctl00$ctl05','')">Users</a></td> 
    </tr><tr onmouseover="this.className = 'highlightedRow';" onmouseout="this.className = 'normalRow';" onclick="GoToNodePage('522');" style="height:18px;">""" 

soup = BeautifulSoup(xml) 
print([i.get('onclick') for i in soup.findAll('tr', attrs={'onclick':True})]) 

Dieser Wille zurück ["GoToNodePage('522');"]

Von hier können Sie die Zahl mit Regex zum Beispiel

01 extrahieren
print([re.findall("\d+", i.get('onclick')) for i in soup.findAll('tr', attrs={'onclick':True})]) 

Dies wird [['522']]

+0

Dank Gábor Erdős, die perfekt funktioniert hat, eine Frage, wie kann ich das Ergebnis in eine Liste zu bekommen, etwas, mit dem ich ziemlich viel zu kämpfen scheinen – ipmev12

+0

Ich denke, ich denke es – ipmev12

+0

Eigentlich ist das eine verschachtelte Liste. Sie erhalten eine Liste von 'findAll' von' BeautifullSoup' und von 'findall' von' re'. Das Ergebnis wird eine Liste in einer Liste sein. Wenn ein "tr" -Tag nur ein "onclick" -Attribut enthalten kann, können Sie das 'findall' von' re' in ein einfaches 'find' umwandeln, und Sie erhalten eine Liste. Es hängt vom Problem ab (ganzes xml) –

Verwandte Themen