在 table 和 MySQL 中显示长货币名称
Displaying Long Currency name in a table with MySQL
我正在使用 Scrapy 制作一个网络抓取工具,它抓取与欧元相比的货币转换评级,并希望在 MySQL [=26] 中显示汇率、货币名称和名称的缩写版本=].我已经做到了,所以汇率和简称可以放在 table 上,但是当我尝试使用完整的货币名称时,唯一放在 table 上的东西是第一个结果。这是我的代码:
刮板本身:
import scrapy
from ..items import EurotocurrencyItem
class CurrencySpider(scrapy.Spider):
name = 'currency'
start_urls = [
'https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html'
]
def parse(self, response):
exchange_rates = response.xpath('//*[@class="forextable"]//tr')
for exchange_rate in exchange_rates:
item = EurotocurrencyItem()
currency = exchange_rate.xpath('.//td[@class="currency"]//text()').extract_first()
currencyl = response.xpath('//td[@class="alignLeft"]//text()').extract_first()
rate = exchange_rate.css('.rate::text').extract_first()
item['currency'] = currency
item['currencyl'] = currencyl
item['rate'] = rate
yield item
items.py:
import scrapy
class EurotocurrencyItem(scrapy.Item):
currency = scrapy.Field()
rate = scrapy.Field()
currencyl = scrapy.Field()
pipelines.py:
import mysql.connector
class EurotocurrencyPipeline:
def __init__(self):
self.create_connection()
self.create_table()
def create_connection(self):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
passwd='notrealpassword',
database='currency'
)
self.curr = self.conn.cursor()
def create_table(self):
self.curr.execute("""DROP TABLE IF EXISTS currency_tb""")
self.curr.execute("""create table currency_tb(
currency text,
rate text,
currencyl text
)""")
def process_item(self, item, spider):
self.store_db(item)
return item
def store_db(self, item):
self.curr.execute("""insert into currency_tb values(%s, %s, %s )""", (
item['currency'],
item['currencyl'],
item['rate']
))
self.conn.commit()
您的currencyl
选择有两个小错误:
首先,您必须遍历 exchange_rate
而不是 response
(因为您已经正确地针对货币和汇率做了)。
此外,您的 xpath()
中还缺少一个 .
。
所以这应该按预期工作:
currencyl = exchange_rate.xpath('.//td[@class="alignLeft"]//text()').extract_first()
我正在使用 Scrapy 制作一个网络抓取工具,它抓取与欧元相比的货币转换评级,并希望在 MySQL [=26] 中显示汇率、货币名称和名称的缩写版本=].我已经做到了,所以汇率和简称可以放在 table 上,但是当我尝试使用完整的货币名称时,唯一放在 table 上的东西是第一个结果。这是我的代码:
刮板本身:
import scrapy
from ..items import EurotocurrencyItem
class CurrencySpider(scrapy.Spider):
name = 'currency'
start_urls = [
'https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html'
]
def parse(self, response):
exchange_rates = response.xpath('//*[@class="forextable"]//tr')
for exchange_rate in exchange_rates:
item = EurotocurrencyItem()
currency = exchange_rate.xpath('.//td[@class="currency"]//text()').extract_first()
currencyl = response.xpath('//td[@class="alignLeft"]//text()').extract_first()
rate = exchange_rate.css('.rate::text').extract_first()
item['currency'] = currency
item['currencyl'] = currencyl
item['rate'] = rate
yield item
items.py:
import scrapy
class EurotocurrencyItem(scrapy.Item):
currency = scrapy.Field()
rate = scrapy.Field()
currencyl = scrapy.Field()
pipelines.py:
import mysql.connector
class EurotocurrencyPipeline:
def __init__(self):
self.create_connection()
self.create_table()
def create_connection(self):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
passwd='notrealpassword',
database='currency'
)
self.curr = self.conn.cursor()
def create_table(self):
self.curr.execute("""DROP TABLE IF EXISTS currency_tb""")
self.curr.execute("""create table currency_tb(
currency text,
rate text,
currencyl text
)""")
def process_item(self, item, spider):
self.store_db(item)
return item
def store_db(self, item):
self.curr.execute("""insert into currency_tb values(%s, %s, %s )""", (
item['currency'],
item['currencyl'],
item['rate']
))
self.conn.commit()
您的currencyl
选择有两个小错误:
首先,您必须遍历 exchange_rate
而不是 response
(因为您已经正确地针对货币和汇率做了)。
此外,您的 xpath()
中还缺少一个 .
。
所以这应该按预期工作:
currencyl = exchange_rate.xpath('.//td[@class="alignLeft"]//text()').extract_first()