2012-03-20 38 views
12

Tôi cần trích xuất dữ liệu từ các tệp HTML. Các tệp được đề cập rất có thể được tạo tự động. Tôi đã tải mã của một trong các tệp này lên Pastebin: http://pastebin.com/9Nj2Edfv. Đây là liên kết đến trang thực tế: 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=%23texteTrích xuất dữ liệu từ các tệp HTML với BeautifulSoup và Python

Dữ liệu tôi cần trích xuất được tìm thấy trong các tiêu đề khác nhau.

Đây là những gì tôi có cho đến nay:

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 

tôi có tất cả các dữ liệu được lưu trữ tại địa phương đó là lý do nó sẽ mở file ecj_1.html.

Số Celex và ngôn ngữ xác thực hoạt động tốt.

celex trả

"Celex number: 
61977J0059" 

auth_lang trả "Authentic language: <li>French</li>"

tôi cần chỉ là nội dung của thẻ h1 (không phải là phá vỡ ở cuối).

[Ngoài ra, tôi cần auth_lang trở lại chỉ là "Pháp", và không phải là <li> -tags.] Đây không phải là một vấn đề nữa. Tôi nhận ra rằng tôi chỉ có thể thêm ".text" vào cuối "auth_lang".

Thủ tục mặt khác trả về này:

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

đó là hoàn toàn sai lầm như tôi chỉ cần nó để trở về "tham chiếu cho một phán quyết sơ bộ".

Có cách nào để tôi có thể đạt được điều này không?

Second chỉnh sửa: tôi thay celex = soup.find('h1') với celex = soup('h1', limit=2)[0] và thêm .text đến celex in.

Trả lời

3

Nội dung của mỗi chuỗi được tìm thấy là danh sách, chỉ hai giá trị đầu tiên là 1. Tuy nhiên, procedure dài 5 phần tử và mục nhập sau (trong trường hợp này) là số thứ tư. Tôi cũng đã sử dụng splitlines() để loại bỏ các dòng mới.

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] 

đầu ra:

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

Fraxel: Cảm ơn bạn rất nhiều! Nó hoạt động như một say mê. Ý tưởng là bằng cách nào đó chuyển đầu ra của tệp này sang cơ sở dữ liệu. Tôi tin rằng bạn có thể đã giải quyết được một vấn đề trong tương lai khi bạn chỉ cho tôi cách loại bỏ các dòng mới vì chúng có khả năng làm hỏng một số thứ sau này. Cảm ơn bạn lần nữa! – A2D2

Các vấn đề liên quan