Извлечение данных из HTML-файлов с помощью BeautifulSoup и Python - PullRequest
13 голосов
/ 20 марта 2012

Мне нужно извлечь данные из HTML-файлов.Рассматриваемые файлы, скорее всего, генерируются автоматически.Я загрузил код одного из этих файлов в Pastebin: http://pastebin.com/9Nj2Edfv. Это ссылка на фактическую страницу: 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 =% 23texte

Данные, которые мне нужно извлечь, находятся под разными заголовками.

Это то, что у меня есть:

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

У меня все данные хранятся локально, поэтому он открывает файл ecj_1.html.

Число Celex и Аутентичный язык работают несколько хорошо.

celex возвращает

"Celex number: 
61977J0059"

auth_lang возвращает "Authentic language: <li>French</li>"

Мне нужно только содержимое тега h1 (не разрыв в конце).

[Также мне нужно, чтобы auth_lang возвращал только «французский», а не <li> -tags.] Это больше не проблема.Я понял, что могу просто добавить «.text» в конец «auth_lang».

Процедура, с другой стороны, возвращает это:

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

, что совершенно неправильно, так как япросто нужно вернуть «Ссылка на предварительное решение».

Есть ли способ, которым я могу добиться этого?

Второе редактирование: я заменил celex = soup.find('h1') на celex = soup('h1', limit=2)[0] идобавлен .text к принтеру celex.

1 Ответ

4 голосов
/ 20 марта 2012

Содержимое каждой из найденных последовательностей представляет собой списки, только первые два имеют длину 1. Однако procedure имеет длину 5 элементов, а запись, за которой вы (в данном случае), является четвертой.Я использовал splitlines () , чтобы избавиться и от новых строк.

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]

output:

Celex number: 61977J0059
Authentic language: French
Type of procedure: Reference for a preliminary ruling
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...