网页中文词语抓取+词云显示

下面用到三个重要的库:
1,urllib2:用于访问网页,通过urlopen方法获取网页内容;
2,sgmllib:通过其中的SGMLPraser对网页内容进行分析,此处需要重载SGMLPraser基类,并将网页内容喂给其;
3,wordcloud:通过WordCloud配置词云,通过其generate创建次云;
4,matplotlib:用于显示词云;

# -*- coding:utf-8-*-
import urllib2
from sgmllib import SGMLParser

__author__ = 'niliang'

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 绘制词云
def draw_wordcloud(wordlist):
    #color_mask = imread("Anne_Hathaway.png") # 读取背景图片
    cloud = WordCloud(
        font_path="/usr/share/fonts/truetype/droid/DroidSansJapanese.ttf",
        background_color='black',
        #mask=color_mask,
        max_words=len(wordlist.split(' ')),#4100,
        max_font_size=60,
        min_font_size=5
    )
    word_cloud = cloud.generate(wordlist) # 产生词云
    #word_cloud.to_file("pjl_cloud4.jpg") #保存图片
    #  显示词云图片
    plt.imshow(word_cloud)
    plt.axis('off')
    plt.show()


def is_ustr(in_str):
    for i in range(len(in_str)):
        if not is_uchar(in_str[i]):
            return False
    return in_str
def is_uchar(uchar):
    if uchar >= u'\u4e00' and uchar<=u'\u9fa5':
            return True
    #if uchar >= u'\u0030' and uchar<=u'\u0039':
    #        return True        
    #if (uchar >= u'\u0041' and uchar<=u'\u005a') or (uchar >= u'\u0061' and uchar<=u'\u007a'):
    #        return True
    #if uchar in ('/'):
    #        return True
    return False

class ListName(SGMLParser):
        def __init__(self):
                SGMLParser.__init__(self)
                self.is_a = ""
                self.name = []
        def start_a(self, attrs):
                self.is_a = 1
        def end_a(self):
                self.is_a = ""
        def handle_data(self, text):
                if self.is_a == 1:
                        self.name.append(text)

if __name__ == '__main__':
        content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read()
        listname = ListName()
        listname.feed(content)
        itemset_original=set(listname.name)
        itemset_unicode=[]
        for item in itemset_original:
                tmp = item.decode('utf8')
                tmp = tmp.strip(' ')
                if(is_ustr(tmp)):
                        itemset_unicode.append(tmp) 

        #for item in itemset_unicode:
                #print item.encode('gbk')
        itemstr=''
        for item in itemset_unicode:
            itemstr+=item
            itemstr+=' '
        print itemstr
        draw_wordcloud(itemstr)
### 如何用 Python 爬取网页内容并生成具有自定义轮廓的图 要实现通过 Python 抓取网页数据并生成带有自定义轮廓的图,可以分为以下几个部分来完成: #### 数据获取阶段 为了从网页上提取所需的数据,通常会使用 `requests` 和 `BeautifulSoup` 库。这些工具可以帮助我们发送 HTTP 请求以及解析 HTML 文档。 ```python import requests from bs4 import BeautifulSoup def fetch_web_content(url): response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') text_data = soup.get_text() # 提取纯文本 return text_data.strip() else: raise Exception(f"Failed to retrieve data from {url}. Status code: {response.status_code}") ``` 上述代码展示了如何利用 `requests` 获取指定 URL 的响应,并借助 `BeautifulSoup` 解析页面中的文字内容[^1]。 #### 处理文本清洗 在获得原始文本之后,可能还需要进一步清理无关字符或者停用(stopwords)。这一步骤对于提高最终的质量至关重要。 ```python import re def clean_text(raw_text): cleaned_text = re.sub(r'\s+', ' ', raw_text).strip() # 移除多余空白符 return cleaned_text.lower() # 转换为小写形式以便统一处理 ``` 这里简单介绍了正则表达式的应用以去除多余的空格和其他不必要的符号[^2]。 #### 创建带形状约束的 最后,在准备好干净的语料库后,则可调用 `WordCloud` 类来自动生成视觉化的词语分布图像。如果希望赋予特定几何形态给产生的图表,则需额外准备一张作为模板使用的图片文件。 ```python from wordcloud import WordCloud import numpy as np from PIL import Image mask = np.array(Image.open("custom_shape.png")) # 加载遮罩图形 wc = WordCloud(background_color="white", max_words=2000, mask=mask) text_for_cloud = " ".join(cleaned_texts) # 假设已有一个列表存储所有预处理后的字符串片段 wc.generate(text_for_cloud) plt.figure(figsize=(8, 6)) plt.imshow(wc, interpolation='bilinear') plt.axis('off') # 不显示坐标轴 plt.show() ``` 此段脚本说明了怎样加载外部 PNG 文件充当蒙版参数传递给 constructor 方法创建实例对象;随后传入整理完毕的大段叙述填充至其中形成图案效果[^3]。 #### 注意事项 - 需确认目标站点允许自动化访问行为。 - 对于复杂的动态加载网站,单纯依靠 request 可能无法满足需求,此时考虑采用 Selenium 或 Playwright 这样的浏览器模拟框架替代之。 - 图片路径应确保正确无误且分辨率足够高以免影响呈现质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值