继续上次的话题,这次抓取的网页是天涯论坛中,“地缘看世界”

1、获取网址:通过正则表达式来获取各贴子网址

link='http://www.tianya.cn/publicforum/content/worldlook/1/223829.shtml'
    html=urllib2.urlopen(link).read()
    m=re.search(r'name=\'idArticleslist\' value=\S*>',html)
    IDs=re.findall(r'[0-9]+',m.group(0))

for ID in IDs:
        url="http://www.tianya.cn/publicforum/content/worldlook/1/%s.shtml"%ID

2、 下载网页:以前是边下载边处理,这样处理时间长,有时还有下载不了的情况,改为下载到指定目录,并在下载前检查是否存在同名

htmldir=r'.\html\\'

filename=htmldir+url.split('/')[-1]
    if (not os.path.exists(filename)) or os.path.getsize(filename)==0:
        print 'downloading'+filename+'\n'
        html=urlRead(url)
        if len(html)>0:
            f=open(filename,'w')
            f.write(html)
            f.close()

3、下载后对网页内容进行分析,在分析前要对网页进行处理以去除htmlparser无法处理的部分,实质是对网页进行截取,并将无法处理字符串替换

txts=re.split(r'<div class="respond" %ID
       pool.add_task(getHtml,url,htmldir)

pool.wait_completion()

8、输出到pdf,我使用了reportlab要注意的是:

引用字体:

reportlab.rl_config.warnOnMissingFontGlyphs = 0

pdfmetrics.registerFont(TTFont('YaHei', 'msyh.ttf'))
pdfmetrics.registerFont(TTFont('YaHeiBD', 'msyhbd.ttf'))
fonts.addMapping('YaHei', 0, 0, 'YaHei')
fonts.addMapping('YaHei', 0, 1, 'YaHei')
fonts.addMapping('YaHeiBD', 1, 0, 'YaHeiBD')
fonts.addMapping('YaHeiBD', 1, 1, 'YaHeiBD')
stylesheet=getSampleStyleSheet()
normalStyle = copy.deepcopy(stylesheet['Normal'])
normalStyle.fontName ='YaHei'

其次是中文换行:

normalStyle.wordWrap = 'CJK'

中文的左缩进有bug设置左缩进后,第一行全部向右移,并不是比其他的行前面少几个字

最后是嵌入图片:取得图片的长和宽,然后设置缩放比,

def get_image(path):
    width=439
    height=685
    img = utils.ImageReader(path)
    iw, ih = img.getSize()
   
    if iw>width or ih>height:
        rw=float(iw)/float(width)
        rh=float(ih)/float(height)
        if rw>rh:
            return Image(path,width,round(ih/rw))
        else:
            return Image(path,round(iw/rh),height)
    else:
        return Image(path)

结论:python是处理网页的利器,但我在编码上浪费了许多时间,在htmlparser和re中对中文的编码支持也不好,不知道各达人有没有什么好方法。

python号称是“胶水语言”,但我始终对如何将其与其他诸如C#,java在一起使用感到困惑。

多线程下载还是存在很多问题,各位在借鉴时一定要注意。

相关文章:

  • 2021-10-11
  • 2021-11-25
  • 2021-10-26
  • 2022-01-05
  • 2021-09-11
  • 2022-12-23
  • 2021-12-25
  • 2022-12-23
猜你喜欢
  • 2021-12-12
  • 2021-11-14
  • 2022-12-23
  • 2021-07-17
  • 2021-12-04
  • 2021-12-22
  • 2021-05-21
相关资源
相似解决方案