最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度剖析使用python抓取網(wǎng)頁(yè)正文的源碼

 更新時(shí)間:2014年06月11日 15:06:47   投稿:hebedich  
平時(shí)打開一個(gè)網(wǎng)頁(yè),除了文章的正文內(nèi)容,通常會(huì)有一大堆的導(dǎo)航,廣告和其他方面的信息。本文的目的,在于說(shuō)明如何從一個(gè)網(wǎng)頁(yè)中提取出文章的正文內(nèi)容,而過(guò)渡掉其他無(wú)關(guān)的的信息。

本方法是基于文本密度的方法,最初的想法來(lái)源于哈工大的《基于行塊分布函數(shù)的通用網(wǎng)頁(yè)正文抽取算法》,本文基于此進(jìn)行一些小修改。

約定:
       本文基于網(wǎng)頁(yè)的不同行來(lái)進(jìn)行統(tǒng)計(jì),因此,假設(shè)網(wǎng)頁(yè)內(nèi)容是沒有經(jīng)過(guò)壓縮的,就是網(wǎng)頁(yè)有正常的換行的。

       有些新聞網(wǎng)頁(yè),可能新聞的文本內(nèi)容比較短,但其中嵌入一個(gè)視頻文件,因此,我會(huì)給予視頻較高的權(quán)重;這同樣適用于圖片,這里有一個(gè)不足,應(yīng)該是要根據(jù)圖片顯示的大小來(lái)決定權(quán)重的,但本文的方法未能實(shí)現(xiàn)這一點(diǎn)。

       由于廣告,導(dǎo)航這些非正文內(nèi)容通常以超鏈接的方式出現(xiàn),因此文本將給予超鏈接的文本權(quán)重為零。

       這里假設(shè)正文的內(nèi)容是連續(xù)的,中間不包含非正文的內(nèi)容,因此實(shí)際上,提取正文內(nèi)容,就是找出正文內(nèi)容的開始和結(jié)束的位置。     

步驟:

       首先清除網(wǎng)頁(yè)中CSS,Javascript,注釋,Meta,Ins這些標(biāo)簽里面的內(nèi)容,清除空白行。

       計(jì)算每一個(gè)行的經(jīng)過(guò)處理的數(shù)值(1)

       計(jì)算上面得出的每行文本數(shù)的最大正子串的開始結(jié)束位置

其中第二步需要說(shuō)明一下:

       對(duì)于每一行,我們需要計(jì)算一個(gè)數(shù)值,這個(gè)數(shù)值的計(jì)算如下:

              一個(gè)圖片標(biāo)簽img,相當(dāng)于出現(xiàn)長(zhǎng)度為50字符的文本 (給予的權(quán)重),x1,

              一個(gè)視頻標(biāo)簽embed,相當(dāng)于出現(xiàn)長(zhǎng)度為1000字符的文本, x2

              一行內(nèi)所有鏈接的標(biāo)簽 a 的文本長(zhǎng)度 x3 ,

              其他標(biāo)簽的文本長(zhǎng)度 x4

              每行的數(shù)值 = 50 * x1其出現(xiàn)次數(shù) + 1000 * x2其出現(xiàn)次數(shù) + x4 – 8

        //說(shuō)明, -8 因?yàn)槲覀円?jì)算一個(gè)最大正子串,因此要減去一個(gè)正數(shù),至于這個(gè)數(shù)應(yīng)該多大,我想還是按經(jīng)驗(yàn)來(lái)吧。

完整代碼

復(fù)制代碼 代碼如下:

#coding:utf-8
import re

def remove_js_css (content):
    """ remove the the javascript and the stylesheet and the comment content (<script>....</script> and <style>....</style> <!-- xxx -->) """
    r = re.compile(r'''<script.*?</script>''',re.I|re.M|re.S)
    s = r.sub ('',content)
    r = re.compile(r'''<style.*?</style>''',re.I|re.M|re.S)
    s = r.sub ('', s)
    r = re.compile(r'''<!--.*?-->''', re.I|re.M|re.S)
    s = r.sub('',s)
    r = re.compile(r'''<meta.*?>''', re.I|re.M|re.S)
    s = r.sub('',s)
    r = re.compile(r'''<ins.*?</ins>''', re.I|re.M|re.S)
    s = r.sub('',s)
    return s

def remove_empty_line (content):
    """remove multi space """
    r = re.compile(r'''^\s+$''', re.M|re.S)
    s = r.sub ('', content)
    r = re.compile(r'''\n+''',re.M|re.S)
    s = r.sub('\n',s)
    return s

def remove_any_tag (s):
    s = re.sub(r'''<[^>]+>''','',s)
    return s.strip()

def remove_any_tag_but_a (s):
    text = re.findall (r'''<a[^r][^>]*>(.*?)</a>''',s,re.I|re.S|re.S)
    text_b = remove_any_tag (s)
    return len(''.join(text)),len(text_b)

def remove_image (s,n=50):
    image = 'a' * n
    r = re.compile (r'''<img.*?>''',re.I|re.M|re.S)
    s = r.sub(image,s)
    return s

def remove_video (s,n=1000):
    video = 'a' * n
    r = re.compile (r'''<embed.*?>''',re.I|re.M|re.S)
    s = r.sub(video,s)
    return s

def sum_max (values):
    cur_max = values[0]
    glo_max = -999999
    left,right = 0,0
    for index,value in enumerate (values):
        cur_max += value
        if (cur_max > glo_max) :
            glo_max = cur_max
            right = index
        elif (cur_max < 0):
            cur_max = 0

    for i in range(right, -1, -1):
        glo_max -= values[i]
        if abs(glo_max < 0.00001):
            left = i
            break
    return left,right+1

def method_1 (content, k=1):
    if not content:
        return None,None,None,None
    tmp = content.split('\n')
    group_value = []
    for i in range(0,len(tmp),k):
        group = '\n'.join(tmp[i:i+k])
        group = remove_image (group)
        group = remove_video (group)
        text_a,text_b= remove_any_tag_but_a (group)
        temp = (text_b - text_a) - 8
        group_value.append (temp)
    left,right = sum_max (group_value)
    return left,right, len('\n'.join(tmp[:left])), len ('\n'.join(tmp[:right]))

def extract (content):
    content = remove_empty_line(remove_js_css(content))
    left,right,x,y = method_1 (content)
    return '\n'.join(content.split('\n')[left:right])

代碼 從最后一個(gè)函數(shù)開始調(diào)用。

相關(guān)文章

  • Python線性方程組求解運(yùn)算示例

    Python線性方程組求解運(yùn)算示例

    這篇文章主要介紹了Python線性方程組求解運(yùn)算,涉及Python使用scipy.linalg.solve進(jìn)行方程組求解運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python爬蟲PyQuery庫(kù)基本用法入門教程

    Python爬蟲PyQuery庫(kù)基本用法入門教程

    這篇文章主要介紹了Python爬蟲PyQuery庫(kù)基本用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了pyQuery庫(kù)字符串初始化、打開網(wǎng)頁(yè)、css屬性、標(biāo)簽內(nèi)容等獲取、DOM基本操作等相關(guān)技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • python 批量重命名移動(dòng)文件

    python 批量重命名移動(dòng)文件

    這篇文章主要介紹了如何用python 批量重命名移動(dòng)多個(gè)文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python實(shí)現(xiàn)多個(gè)圓和圓中圓的檢測(cè)

    Python實(shí)現(xiàn)多個(gè)圓和圓中圓的檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)多個(gè)圓檢測(cè)和圓中圓的檢測(cè),文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-11-11
  • python數(shù)據(jù)可視化Seaborn繪制山脊圖

    python數(shù)據(jù)可視化Seaborn繪制山脊圖

    這篇文章主要介紹了利用python數(shù)據(jù)可視化Seaborn繪制山脊圖,山脊圖一般由垂直堆疊的折線圖組成,這些折線圖中的折線區(qū)域間彼此重疊,此外它們還共享相同的x軸.下面來(lái)看看具體的繪制過(guò)程吧,需要的小伙伴可以參考一下
    2022-01-01
  • Python把excel文件數(shù)據(jù)轉(zhuǎn)化為字典格式存儲(chǔ)詳解

    Python把excel文件數(shù)據(jù)轉(zhuǎn)化為字典格式存儲(chǔ)詳解

    這篇文章主要介紹了Python把excel文件數(shù)據(jù)轉(zhuǎn)化為字典格式存儲(chǔ)詳解,在Python中有時(shí)候需要操作excel表格的數(shù)據(jù),把excel表格轉(zhuǎn)化為字典存起來(lái),方便讀取,今天我們就來(lái)看看如何轉(zhuǎn)換,需要的朋友可以參考下
    2023-08-08
  • python中的時(shí)區(qū)問題

    python中的時(shí)區(qū)問題

    這篇文章主要介紹了python中的時(shí)區(qū)問題的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python3.5集合及其常見運(yùn)算實(shí)例詳解

    Python3.5集合及其常見運(yùn)算實(shí)例詳解

    這篇文章主要介紹了Python3.5集合及其常見運(yùn)算,結(jié)合實(shí)例形式分析了Python3.5集合的定義、功能、交集、并集、差集等常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • PyG搭建GCN模型實(shí)現(xiàn)節(jié)點(diǎn)分類GCNConv參數(shù)詳解

    PyG搭建GCN模型實(shí)現(xiàn)節(jié)點(diǎn)分類GCNConv參數(shù)詳解

    這篇文章主要為大家介紹了PyG搭建GCN模型實(shí)現(xiàn)節(jié)點(diǎn)分類GCNConv參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Django的模版來(lái)配合字符串翻譯工作

    使用Django的模版來(lái)配合字符串翻譯工作

    這篇文章主要介紹了使用Django的模版來(lái)配合字符串翻譯工作,Django是最具人氣的Python開發(fā)框架,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

区。| 布拖县| 大名县| 建平县| 靖远县| 墨玉县| 兰西县| 贵德县| 博爱县| 衡阳市| 阳江市| 郓城县| 宁德市| 微山县| 英德市| 合山市| 云和县| 龙江县| 顺昌县| 峨山| 太保市| 青浦区| 井冈山市| 天等县| 青田县| 洛宁县| 特克斯县| 中卫市| 揭东县| 七台河市| 绥德县| 徐闻县| 德庆县| 汉沽区| 涟源市| 灵璧县| 鄂温| 磴口县| 巨野县| 墨脱县| 满城县|