2016-10-26 7 views
1

Ich fange an, Python zu lernen und möchte BeautifulSoup verwenden, um die Elemente in den unten aufgeführten HTML zu extrahieren.So extrahieren Sie Elemente aus HTML mit BeautifulSoup

Diese html von einem Sprachaufzeichnungssystem genommen wird, die die Zeit und das Datum in Ortszeit protokolliert, UTC, Gesprächsdauer, angerufene Nummer, Name, Rufnummer, Name, etc
Es gibt in der Regel Hunderte dieser Einträge.

Ich versuche, die Elemente zu extrahieren und sie in einer Zeile in ein Komma-getrenntes Format zu drucken, um mit Anrufdetailaufzeichnungen von Anrufmanager zu vergleichen. Dies hilft zu überprüfen, ob alle Anrufe aufgezeichnet wurden und nicht verpasst wurden.

Ich glaube BeautifulSoup ist das richtige Werkzeug, um dies zu tun.
Kann mir jemand in die richtige Richtung zeigen?

<tbody> 
 
    <tr class="formRowLight"> 
 

 
<td class="formRowLight" >24/10/16<br>16:24:47</td> 
 
<td class="formRowLight" >24/10/16 07:24:47</td> 
 
<td class="formRowLight" >00:45</td> 
 
<td class="formRowLight" >31301</td> 
 
<td class="formRowLight" >Joe Smith</td> 
 
<td class="formRowLight" >31111</td> 
 
<td class="formRowLight" >Jane Doe</td> 
 
<td class="formRowLight" >N/A</td> 
 
<td class="formRowLight" >1432875648934</td> 
 
<td align="center" class"formRowLight">&nbsp;</td> 
 

 
    <tr class="formRowLight"> 
 

 
<td class="formRowLight" >24/10/16<br>17:33:02</td> 
 
<td class="formRowLight" >24/10/16 08:33:02</td> 
 
<td class="formRowLight" >00:58</td> 
 
<td class="formRowLight" >35664</td> 
 
<td class="formRowLight" >Billy Bob</td> 
 
<td class="formRowLight" >227045665</td> 
 
<td class="formRowLight" >James Dean</td> 
 
<td class="formRowLight" >N/A</td> 
 
<td class="formRowLight" >9934959586849</td> 
 
<td align="center" class"formRowLight">&nbsp;</td> 
 
</tr> 
 
</tbody>

+0

https://www.crummy.com/software/BeautifulSoup/bs4/doc/ –

+0

Ja, bs4 ist ein gutes Werkzeug zu erreichen, um diese Aufgabe zu erledigen. Wenn Sie sagen, drucken Sie sie in einer Zeile aus Meinst du, du willst *** alle *** der Informationen in einer einzigen Zeile gedruckt?Nur der Text in jedem Tag? Möchten Sie Zeilen trennen oder haben Sie einfach alle Daten zusammen? Etwas mehr Klarheit über die erwartete Leistung wäre hilfreich. Außerdem: Was hast du bisher versucht? – sytech

+0

Ich suche etwas wie dieses: 24/10/16 17:33:02, 24/10/16 08:33:02, 00:58, 35664, Billy Bob, 227045665, James Dean, N/A, 9934959586849 Ich habe bei der Arbeit etwas Code ausprobiert, aber ich habe die Ergebnisse, die ich gesucht habe, nicht erreicht. – cpnhowdy

Antwort

1

Die pandas.read_html() würde die Dinge viel einfacher - es Ihre Tabellendaten aus der HTML-Tabelle in eine dataframe die umwandeln würde, wenn nötig, können Sie später dump into CSV.

Hier ist ein Beispielcode zum Einstieg:

import pandas as pd 

data = """ 
<table> 
    <thead> 
     <tr> 
      <th>Date</th> 
      <th>Name</th> 
      <th>ID</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr class="formRowLight"> 
      <td class="formRowLight">24/10/16<br>16:24:47</td> 
      <td class="formRowLight">Joe Smith</td> 
      <td class="formRowLight">1432875648934</td> 
     </tr> 

     <tr class="formRowLight"> 
      <td class="formRowLight">24/10/16<br>17:33:02</td> 
      <td class="formRowLight">Billy Bob</td> 
      <td class="formRowLight">9934959586849</td> 
     </tr> 
    </tbody> 
</table>""" 

df = pd.read_html(data)[0] 
print(df.to_csv(index=False)) 

Drucke:

Date,Name,ID 
24/10/1616:24:47,Joe Smith,1432875648934 
24/10/1617:33:02,Billy Bob,9934959586849 

FYI, read_html()BeautifulSoup tatsächlich verwendet HTML unter der Motorhaube zu analysieren.

+0

Nein, aber das wäre eher ein Kommentar als eine Antwort –

1
import BeautifulSoup 
import urllib2 
import requests 

request = urllib2.Request(your url) 
response = urllib2.urlopen(request) 
soup = BeautifulSoup.BeautifulSoup(response) 

mylist = [] 
div = soup.findAll('tr', {"class":"formRowLight"}) 
for line in div: 
    text= video.findNext('td',{"class":"formRowLight"}).text 
    mylist.append(text) 

print mylist 

Sie müssen diesen Code jedoch ein wenig bearbeiten, um doppelten Inhalt zu vermeiden.

+0

Warum würde dies doppelte Ergebnisse produzieren? – Matt

0

Ja, BeautifulSoup ist ein gutes Werkzeug, um in diesem Problem zu erreichen. Etwas Sie würden wie folgt beginnen:

from bs4 import BeautifulSoup 

with open("my_log.html") as log_file: 
    html = log_file.read() 
soup = BeautifulSoup(html) 
#normally you specify a parser too `(html, 'lxml')` for example 
#without specifying a parser, it will warn you and select one automatically 

table_rows = soup.find_all("tr") #get list of all <tr> tags 
for row in table_rows: 
    table_cells = row.find_all("td") #get list all <td> tags in row 
    joined_text = ",".join(cell.get_text() for cell in table_cells) 
    print(joined_text) 

jedoch pandas ‚s read_html kann dies nahtlos etwas machen, wie in einer anderen Antwort auf diese Frage erwähnt. Wahrscheinlich pandas kann ein besserer Hammer sein, um diesen Nagel mit zu treffen, aber das Lernen, BeautifulSoup dafür zu verwenden, gibt Ihnen auch die Fähigkeiten, alle Arten von HTML in der Zukunft zu kratzen.

Verwandte Themen