我正在从IMDB Top 250 Movies页面中抓取数据,特别是试图检索用户投票信息。
用户投票的HTML结构是这样的:
" ("
"3.8M"
")"
字符串
所以,当我使用CSS选择器response.css('.ipc-rating-star--voteCount::text').getall()
提取这些信息时,我得到了一个包含第一个括号、投票和最后一个括号的列表
的数据
我想从这个结构中只提取数字部分(用户投票值),而不包括括号
这是我的全部代码:
movie_data = []
class IMDBSpider(scrapy.Spider):
name = 'imdb_spider'
def start_requests(self):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
yield scrapy.Request(url, headers=headers, callback=self.parse)
def parse(self, response):
# movie name
movie_name = response.css('ul.ipc-metadata-list h3.ipc-title__text::text').getall()
# movie year
movie_year = response.css('.sc-c7e5f54-8.hgjcbi.cli-title-metadata-item:first-child::text').getall()
# movie ratings
movie_rating = response.css('ul.ipc-metadata-list span.ipc-rating-star--base::text').getall()
# user votings
user_vote = response.css('.ipc-rating-star--voteCount::text').getall()
print(response.css('.ipc-rating-star--voteCount::text').getall())
for name, year, rating, votes in zip(movie_name, movie_year, movie_rating, user_vote):
self.log(f'Processing: {name}, {year}, {rating}, {votes}')
relevant_elements = self.extract_combined_str(votes)
self.log(f'Relevant Elements: {relevant_elements}')
movie_dict = {
'movie_name': self.extract_name(name), # Call the extract_name method using self
'movie_year': year.strip(),
'movie_rating': rating.strip(),
'user_votes': [vote for vote in votes]
}
movie_data.append(movie_dict)
delay = random.uniform(2, 5)
self.log(f'Delaying for {delay} seconds.')
time.sleep(delay)
def extract_name(self, name):
name = name.strip()
name = re.sub(r'^\d+\.\s*', '', name)
return name
def extract_combined_str(self, votes):
# Filtra solo los elementos que contienen dígitos y paréntesis
numeric_value = re.search(r'\(([\d.]+[MK]?)\)', votes)
return numeric_value.group(1) if numeric_value else None
型
正如我提到的,我试图提取用户投票并删除括号,但它不起作用,因为它可以在图像中看到。
1条答案
按热度按时间f45qwnt81#
您可以对每个单独的ratings span元素使用get all,然后简单地分割出中心索引,并调用
.strip('()"')
从片段中删除剩余的额外字符。当你一行一行地浏览每个电影部分而不是一次收集它们时,这会容易得多。
举例来说,您可以:
字符串
输出
型