从这个HTML文件中提取数据的最佳方法是什么,并将其放入MySQL数据库,公司电话号码,公司名称和电子邮件主键为电话号码?
</tr><tr class="tableRowOdd">
<td>"JSC company inc. 00" <email@email.com></td>
<td>1231231234</td>
</tr><tr class="tableRowEven">
<td>"JSC company inc. 01" <email01@email.com></td>
<td>234234234234234</td>
</tr><tr class="tableRowOdd">
<td>"JSC company inc. 02" <email2@email.com></td>
<td>32423234234</td>
</tr><tr class="tableRowEven">
<td>"JSC company inc. 03" <email3@email.com></td>
<td>23423424324</td>
</tr><tr class="tableRowOdd">
<td>"JSC company inc. 04" <email4@email.com></td>
<td>234234232324244</td>
</tr> <tr>
答案 0 :(得分:6)
用于提取和一般HTML munging看看
http://www.crummy.com/software/BeautifulSoup/
对于MySQL,我建议谷歌搜索:MySQL教程python
答案 1 :(得分:1)
以下是使用BeautifulSoup
将td
内容放入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" <email@email.com>', u'\n', u'1231231234', u'\n']
[u'\n', u'"JSC company inc. 01" <email01@email.com>', u'\n', u'234234234234234', u'\n']
[u'\n', u'"JSC company inc. 02" <email2@email.com>', u'\n', u'32423234234', u'\n']
[u'\n', u'"JSC company inc. 03" <email3@email.com>', u'\n', u'23423424324', u'\n']
[u'\n', u'"JSC company inc. 04" <email4@email.com>', 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'\"(.*)\" <(.*)>'
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');