使用BeautifulSoup和Python从HTML文件中提取数据

时间:2012-03-20 12:46:32

标签: python beautifulsoup

我需要从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编号和Authentic语言有点好用。

celex返回

"Celex number: 
61977J0059"

auth_lang返回"Authentic language: <li>French</li>"

我只需要h1标签的内容(不是最后的中断)。

[另外,我需要auth_lang只返回“French”,而不是<li> - 标签。 这不再是问题了。我意识到我可以在“auth_lang”的末尾添加“.text”。

另一方面,程序返回:

    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添加到印刷品中。

1 个答案:

答案 0 :(得分:4)

每个找到的序列的内容都是列表,前两个是长度1.但是procedure长度是5个元素,而你之后的条目(在这种情况下)是第4个。我也用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]

输出:

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