使用Python从HTML中提取文本字段?

时间:2009-10-11 17:58:30

标签: python text

从这个HTML文件中提取数据的最佳方法是什么,并将其放入MySQL数据库,公司电话号码,公司名称和电子邮件主键为电话号码?

</tr><tr class="tableRowOdd">
                <td>"JSC company inc. 00" &lt;email@email.com&gt;</td>
                <td>1231231234</td>
            </tr><tr class="tableRowEven">
                <td>"JSC company inc. 01" &lt;email01@email.com&gt;</td>
                <td>234234234234234</td>
            </tr><tr class="tableRowOdd">
                <td>"JSC company inc. 02" &lt;email2@email.com&gt;</td>
                <td>32423234234</td>
            </tr><tr class="tableRowEven">
                <td>"JSC company inc. 03" &lt;email3@email.com&gt;</td>
                <td>23423424324</td>
            </tr><tr class="tableRowOdd">
                <td>"JSC company inc. 04" &lt;email4@email.com&gt;</td>
                <td>234234232324244</td>
            </tr>   <tr>

5 个答案:

答案 0 :(得分:6)

用于提取和一般HTML munging看看

http://www.crummy.com/software/BeautifulSoup/

对于MySQL,我建议谷歌搜索:MySQL教程python

答案 1 :(得分:1)

以下是使用BeautifulSouptd内容放入python列表的方法:

#!/usr/bin/python
from BeautifulSoup import BeautifulSoup, SoupStrainer

def find_rows(data):
    table_rows = SoupStrainer('tr')
    rows = [tag for tag in BeautifulSoup(data, parseOnlyThese=table_rows)]
    return rows

def cell_data(row):
    cells = [tag.string for tag in row.contents]
    return cells

if __name__ == "__main__":
    f = open("testdata.html", "r")
    data = f.read()
    rows = find_rows(data)
    for row in rows:
        print cell_data(row)

将您的html文件保存为testdata.html,并从同一目录运行此脚本。 根据您在此处发布的数据,输出为

[u'\n', u'"JSC company inc. 00" &lt;email@email.com&gt;', u'\n', u'1231231234', u'\n']
[u'\n', u'"JSC company inc. 01" &lt;email01@email.com&gt;', u'\n', u'234234234234234', u'\n']
[u'\n', u'"JSC company inc. 02" &lt;email2@email.com&gt;', u'\n', u'32423234234', u'\n']
[u'\n', u'"JSC company inc. 03" &lt;email3@email.com&gt;', u'\n', u'23423424324', u'\n']
[u'\n', u'"JSC company inc. 04" &lt;email4@email.com&gt;', u'\n', u'234234232324244', u'\n']

答案 2 :(得分:1)

对于解析,我绝对也推荐Beautiful Soup

要将文本放在数据库中,我建议使用一个好的Python ORM。我的最高建议是使用Django中的ORM,如果可以的话。使用Django,您不仅可以获得ORM,还可以使用Web界面,通过Web浏览器浏览数据库;您甚至可以使用Web浏览器将数据输入数据库。

如果你不能使用Django,我推荐SQLAlchemy

祝你好运。

答案 3 :(得分:1)

使用lxml,你几乎可以像使用jQuery一样轻松地完成它。

from lxml import html

doc = html.parse('test.html').getroot()
for row in doc.cssselect('tr'):
    name, phone_number = row.cssselect('td')[:2]
    print name.text_content()
    print phone_number.text_content()

答案 4 :(得分:0)

+1 for BeautifulSoup

现在你已经获得了数据,你需要把它放到MySQL中。如果你想要一个纯python解决方案,你还需要MySQL-Python绑定。

否则,您需要生成的SQL相对无痛。我们会劫持gnuds的例子。添加到文件顶部:

 import re

然后在底部:

exp = r'\"(.*)\" &lt;(.*)&gt;'
for row in rows:
 matcher = re.match(exp, row[1])
 name, email = matcher.groups()
 phone = row[3]

 sql = "INSERT INTO company (email, name, phone) VALUES ('%s','%s','%s')" % (email, name, phone)
 print sql

这给你的输出如下:

INSERT INTO company (email, name, phone) VALUES ('email@email.com','JSC company inc. 00','1231231234');
INSERT INTO company (email, name, phone) VALUES ('email01@email.com','JSC company inc. 01','234234234234234');
INSERT INTO company (email, name, phone) VALUES ('email2@email.com','JSC company inc. 02','32423234234');
INSERT INTO company (email, name, phone) VALUES ('email3@email.com','JSC company inc. 03','23423424324');
INSERT INTO company (email, name, phone) VALUES ('email4@email.com','JSC company inc. 04','234234232324244');