2012-03-20 16 views
12

Potrzebuję wyodrębnić dane z plików HTML. Te pliki są najprawdopodobniej generowane automatycznie. Przesłałem kod jednego z tych plików do Pastebin: http://pastebin.com/9Nj2Edfv. To jest łącze do rzeczywistej strony: http://eur-lex.europa.eu/Notice.do?checktexts=checkbox&val=60504%3Acs&pos=1&page=1&lang=en&pgs=10&nbl=1&list=60504%3Acs%2C&hwords=&action=GO&visu=%23texteWyodrębnianie danych z plików HTML za pomocą BeautifulSoup i Python

Dane, które muszę wyodrębnić, znajdują się pod różnymi nagłówkami.

To, co mam tak daleko:

from BeautifulSoup import BeautifulSoup 
ecj_data = open("data\ecj_1.html",'r').read() 

soup = BeautifulSoup(ecj_data) 

celex = soup.find('h1') 
auth_lang = soup('ul', limit=14)[13].li 
procedure = soup('ul', limit=20)[17].li 

print "Celex number:", celex.renderContents(), 
print "Authentic language:", auth_lang 
print "Type of procedure:", procedure 

Mam wszystkie dane przechowywane lokalnie, który jest przyczyną tego, że otwiera ecj_1.html pliku.

Numer Celex i język Autentyczny działają trochę dobrze.

Celex zwraca

"Celex number: 
61977J0059" 

auth_lang zwraca "Authentic language: <li>French</li>"

Muszę tylko zawartość znacznika H1 (nie przerwie na końcu).

[Również muszę auth_lang powrócić po prostu "francuski", a nie <li> -tags.] To nie jest już problemem. Zdałem sobie sprawę, że mogę dodać ".text" na końcu "auth_lang".

Postępowanie z drugiej strony zwraca to:

Type of procedure: <li> 
    <strong>Type of procedure:</strong> 
    <br /> 
    Reference for a preliminary ruling 
    </li> 

co jest całkiem źle, jak po prostu trzeba go do powrotu „Wniosek o wydanie orzeczenia”.

Czy mogę to osiągnąć?

Druga edycja: Wymieniłem celex = soup.find('h1') z celex = soup('h1', limit=2)[0] i dodał .text do CELEX druku.

Odpowiedz

3

Zawartość każdej z odnalezionych sekwencji to listy, tylko pierwsze dwa mają długość 1. Jednak procedure ma długość 5 elementów, a wpis, po którym się znajdujesz (w tym przypadku) jest czwartym. Użyłem też splitlines(), aby pozbyć się także nowych linii.

print "Celex number:", celex.contents[0].splitlines()[1] 
print "Authentic language:", auth_lang.contents[0].splitlines()[0] 
print "Type of procedure:", procedure.contents[4].splitlines()[1] 

wyjściowa:

Celex number: 61977J0059 
Authentic language: French 
Type of procedure: Reference for a preliminary ruling 
+0

Fraxel: Dziękuję bardzo! To działa jak urok. Chodzi o to, aby w jakiś sposób przenieść dane wyjściowe tego pliku do bazy danych. Sądzę, że być może rozwiązałeś przyszły problem, kiedy pokazałeś mi, jak pozbyć się nowych linii, ponieważ mogą później coś zepsuć. Jeszcze raz dziękuję! – A2D2

Powiązane problemy