Vì vậy, có một số điều cần giải quyết ở đây.
tài liệu về PyMySQL khá giỏi trong việc giúp bạn thiết lập và vận hành.
Tuy nhiên, trước khi bạn có thể đưa những thứ này vào cơ sở dữ liệu, bạn cần lấy chúng theo cách mà nghệ sĩ và tên bài hát được liên kết với nhau. Ngay bây giờ, bạn đang nhận được một danh sách các nghệ sĩ và bài hát riêng biệt, không có cách nào để liên kết chúng. Bạn sẽ muốn lặp lại lớp nghệ sĩ tiêu đề để thực hiện việc này.
Tôi sẽ làm điều này như vậy -
from urllib import urlopen
from bs4 import BeautifulSoup
import pymysql.cursors
# Webpage connection
html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
# Grab title-artist classes and iterate
bsObj = BeautifulSoup(html)
recordList = bsObj.findAll("div", {"class" : "title-artist",})
# Now iterate over recordList to grab title and artist
for record in recordList:
title = record.find("div", {"class": "title",}).get_text().strip()
artist = record.find("div", {"class": "artist"}).get_text().strip()
print artist + ': ' + title
Thao tác này sẽ in tiêu đề và nghệ sĩ cho mỗi lần lặp lại của vòng lặp recordList.
Để chèn các giá trị này vào MySQL DB, tôi đã tạo một bảng có tên artist_song
với những điều sau:
CREATE TABLE `artist_song` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`artist` varchar(255) COLLATE utf8_bin NOT NULL,
`song` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1;
Đây không phải là cách sạch sẽ nhất để giải quyết vấn đề này, nhưng ý tưởng là rất tốt. Chúng tôi muốn mở một kết nối đến MySQL DB (tôi đã gọi là DB top_40 của mình) và chèn một cặp nghệ sĩ / tiêu đề cho mỗi lần lặp lại của vòng lặp recordList:
from urllib import urlopen
from bs4 import BeautifulSoup
import pymysql.cursors
# Webpage connection
html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
# Grab title-artist classes and store in recordList
bsObj = BeautifulSoup(html)
recordList = bsObj.findAll("div", {"class" : "title-artist",})
# Create a pymysql cursor and iterate over each title-artist record.
# This will create an INSERT statement for each artist/pair, then commit
# the transaction after reaching the end of the list. pymysql does not
# have autocommit enabled by default. After committing it will close
# the database connection.
# Create database connection
connection = pymysql.connect(host='localhost',
user='root',
password='password',
db='top_40',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
for record in recordList:
title = record.find("div", {"class": "title",}).get_text().strip()
artist = record.find("div", {"class": "artist"}).get_text().strip()
sql = "INSERT INTO `artist_song` (`artist`, `song`) VALUES (%s, %s)"
cursor.execute(sql, (artist, title))
connection.commit()
finally:
connection.close()
Chỉnh sửa:Theo nhận xét của tôi, tôi nghĩ rằng việc lặp lại các hàng trong bảng sẽ rõ ràng hơn:
from urllib import urlopen
from bs4 import BeautifulSoup
import pymysql.cursors
# Webpage connection
html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
bsObj = BeautifulSoup(html)
rows = bsObj.findAll('tr')
for row in rows:
if row.find('span', {'class' : 'position'}):
position = row.find('span', {'class' : 'position'}).get_text().strip()
artist = row.find('div', {'class' : 'artist'}).get_text().strip()
track = row.find('div', {'class' : 'title'}).get_text().strip()