整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          絕對干貨,Python爬蟲處理\xa0、\u3000、\u2002、\u2003等空格

          ython爬蟲處理\xa0、\u3000、\u2002、\u2003等空格

            • 普通全角空格(\u3000)
            • html實體不間斷空格(\xa0)
            • html實體半角空格(\u2002)
            • html實體全角空格(\u2003)

          在爬取網頁時,對網頁數據清洗時常會遇到空格,有的網頁空格類型還不止一種,如果不能正確處理,可能無法提取到需要的數據。這里記錄下自己使用正則處理各種類型空格的經歷。

          空格類型

          這里把空格格式分兩類,一類這里表述為普通文本空格,另一類表述為html實體空格。普通文本空格介紹 普通半角空格普通全角空格 。html實體空格介紹三種,分別為 html實體不間斷空格 )、 html實體半角空格 ( )和 html實體全角空格 ( )。

          1. 普通半角空格 :英文空格鍵。這是最常見的空格,比如我們寫代碼時,按下空格鍵產生的就是這種空格鍵。正則里直接使用空格或者\s就能匹配,在python中對應的unicode碼為\u0020;
          2. 普通全角空格 :中文空格鍵。中文網頁上常會出現,直接使用正則的\s匹配不到,unicode碼為\u3000;
          3. html實體不間斷空格 :html中的常用空格,出現在html中為 。網頁上看不到,打開瀏覽器開發工具可以看到,unicode碼為\u00A0,對應的十六進制為\xa0;
          4. html實體半角空格 :&ensp,unicode碼為\u2002;
          5. html實體全角空格 :&emsp,unicode碼為\u2003;

          普通半角空格

          這種空格不需要特殊處理,使用正則匹配,可以直接使用空格或者\s。為了以下鋪墊,這里也舉個用unicode碼匹配該類型空格的例子,代碼如下所示

          s = 'hello word, hi python'
          print re.findall(r'i py', s)  # 直接用空格
          print re.findall(r'i\spy', s)  # 用\s
          print re.findall(ur'i\u0020py', s)  # 用unicode碼

          執行結果如下

          普通全角空格(\u3000)

          該鏈接 導航欄各欄目之間有空格(這個就是\u3000類型的,但是直接看不出來,代碼抓取下來可以看到),如下圖所示

          以下使用代碼獲取該段文本,并使用正則提取

          import re
          
          from requests import get
          from lxml import etree
          
          url = 'http://hebng.hljcourt.gov.cn/public/detail.php?id=1818'
          headers = {
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
          resp = get(url, headers=headers)
          html = resp.content.decode('gbk')
          et = etree.HTML(html)
          text_list = et.xpath('/html/body/table[3]/tr[2]//text()')
          text = et.xpath('string(/html/body/table[3]/tr[2])')
          print '=' * 50
          print re.findall(ur'法院概況 新聞中心', text)  # 匹配不到
          print re.findall(ur'法院概況\s新聞中心', text)  # 匹配不到
          print re.findall(ur'法院概況\u3000新聞中心', text)  # 這樣才可以匹配到
          print '=' * 50

          執行結果如下

          從以上圖片可以看到該網頁導航欄各欄目之間的空格就是這種\u3000這種空格,這種類型空格要匹配的話需要在正則表達式中使用unicode碼。

          html實體不間斷空格(\xa0)

          該鏈接 正文之間有很多不間斷空格,打開開發者工具可以直接看到

          以下使用代碼獲取該段文本,并使用正則提取

          import re
          
          from requests import get
          from lxml import etree
          
          url = 'http://sthj.tj.gov.cn/ZWGK4828/ZFXXGK8438/FDZDGK27/XZCFQZXZCFXX7581/202010/t20201020_3958760.html'
          headers = {
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
          resp = get(url, headers=headers)
          html = resp.content.decode('utf-8')
          et = etree.HTML(html)
          text_list = et.xpath('//*[@id="zoom"]/p[30]/text()')
          text = et.xpath('string(//*[@id="zoom"]/p[30])')  # 注意申請行政復議前面有四個空格,其中三個不間斷空格,一個普通半角空格
          print '=' * 200
          print re.findall(ur'\s\s申請行政復議', text)  # 普通半角接普通半角匹配不到
          print re.findall(ur'\xa0\s申請行政復議', text)  # 不間斷空格接普通半角空格可以匹配到
          print re.findall(ur'\u00A0\s申請行政復議', text)  # 不間斷空格接普通半角空格可以匹配到
          print '=' * 200

          執行結果如下

          從以上圖片結果可以看出,使用正則匹配非間斷空格時,需要使用unicode碼\u00A0或者十六進制\xa0。

          html實體半角空格(\u2002)

          該鏈接 正文末尾的日期前面有很多**&ensp**這種空格,打開開發者工具可以直接看到

          以下使用代碼獲取該段文本,并使用正則提取

          import re
          
          from requests import get
          from lxml import etree
          
          url = 'http://sthj.tj.gov.cn/ZWGK4828/ZFXXGK8438/FDZDGK27/XZCFQZXZCFXX7581/202112/t20211207_5743296.html'
          headers = {
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
          resp = get(url, headers=headers)
          html = resp.content.decode('utf-8')
          et = etree.HTML(html)
          text_list = et.xpath('//*[@id="zoom"]/div/p[38]/span[1]/text()')
          text = et.xpath('string(//*[@id="zoom"]/div/p[38]/span[1])')
          print '=' * 200
          print re.findall(ur'\s20', text)  # 普通半角匹配不到
          print re.findall(ur'\u200220', text)  # unicode碼\u2002可以匹配到
          print '=' * 200

          執行結果如下

          從以上圖片結果可以看出,使用正則匹配html實體半角空格時,需要使用unicode碼\u2002。

          html實體全角空格(\u2003)

          該鏈接 正文表格表頭有一列中有該類型空格, ,如下圖所示

          以下使用代碼獲取該段文本,并使用正則提取

          import re
          
          from requests import get
          from lxml import etree
          
          url = 'http://hebng.hljcourt.gov.cn/public/detail.php?id=1818'
          headers = {
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
          resp = get(url, headers=headers)
          html = resp.content.decode('gbk')
          et = etree.HTML(html)
          text_list = et.xpath('//table[@class="ke-zeroborder"]/tbody/tr[1]/td[1]/text()')
          text = et.xpath('string(table[@class="ke-zeroborder"]/tbody/tr[1]/td[1])')
          print '=' * 200
          print re.findall(ur'\t\s\r', text_list[0])  # 普通半角匹配不到
          print re.findall(ur'\t\u2003\r', text_list[0], flags=re.S)  # unicode碼\u2003可以匹配到
          print '=' * 200

          執行結果如下

          從以上結果看出,使用正則匹配html實體半角空格時,需要使用unicode碼\u2003。

          統一處理方式

          從以上幾個例子可以看出,網頁上的空格類型要想處理好,是要兼顧幾種情況的,其實爬蟲主要遇到的就是\xa0、\u3000這兩種。可以使用統一正則匹配,如下測試代碼

          import re
          
          s = u'\u2002\u2003\xa0\u3000Say'
          
          print len(s)
          print s
          print re.findall(r'\s{4}Say', s)  # 普通空格匹配不到
          print re.findall(ur'[\u2002\u2003\xa0\u3000]{4}Say', s)  # 使用unicode碼可以匹配到
          print re.findall(r'\s{4}Say', s, flags=re.U)  # 使用re.U模式可以匹配到

          代碼執行結果如下

          注意看以上結果,這里的s是unicode字符串,共7個字符,其中四個不同類型的空格,使用對應的unicode碼可以匹配到這些空格。

          要注意下當正則模式的編譯標志位(flags)為re.U時,使用正則符號\s是可以匹配到各種類型的空格的

          最后安利一個查unicode字符的網站unicode-table,可以在 html實體 這里看到有許多html中不同類型的空格。

          :為什么SEO人員要學會HTML代碼標簽的使用?

          請注意,會建站不一定意味著懂HTML,現在隨便找個CMS或者博客程序(如WordPress、Z-blog),一個毫無HTML常識的菜鳥都能輕易建站,所以我要強調“一定要懂HTML”。或許很多人在網上看到或者聽某家SEO培訓機構說:“SEO很簡單,你在我們這里學會了,以后直接去指導別人就可以,所以學SEO不用懂HTML”,不要以為我危言聳聽,我確實碰到過很多朋友走進了這樣的誤區,在這里我想說:“學SEO不懂HTML,那你就不用學了!” HTML是SEO不可或缺的一部分,關鍵詞布局、策略的調整都離不開HTML,網站制作時的諸多修改、調整也要用到HTML,想學SEO,先學會HTML吧!


          ① 首先我們大體來介紹了網頁的基本結構,網頁里面標簽分為head和body標簽,翻譯起來很容易理解。head是頭部,里面包含著title(網頁標題)、keyword(關鍵詞)、description(網頁描述)這三個基本標簽,可能還有css以及JS等在head標簽里面,這里我們先不用管他。而我們一般SEOer主要工作就是做網頁標題、關鍵詞、描述這幾個塊,這是不得不做的,但是主要內容都還在body里面,其實這個我們可以把它理解為身體,一個比較成熟的網頁要求五臟六腑俱全。所以里面有很多模塊和功能,現在比較流行的CSS+DIV,代碼比較簡潔,美觀,表現力比較強,所以table也漸漸的退出市場,因為對SEO來說table(表格)占用內存比較多,是DIV的10倍以上,所以我們也能不用最好不用。

          ② 做SEO還必須知道代碼的規范標準,現在通過W3C標準很難,因為網站很難不出現錯誤,其實細小的錯誤肯本沒有影響,只要不多搜索引擎也比較容易接受。但是能不錯誤就不要出現,網頁前面最好申明標準體系,一般我們中國大陸的編碼是GB2312和UTF-8,一般后者用的比較多,這個我們先不解釋。

          ③ 還有就是現在搜索引擎可以讀懂JS代碼,所以對網站影響越來越小,不要在影響用戶體驗的情況下而去除JS,這是不明智的。特別是谷歌,幾年前就可以讀懂一般性JS代碼,就算是導航也沒有影響,但是這里我們也不推薦用JS寫導航.如果朋友們現在想學Html知識了,我向大家推薦去下本HTML標簽的電子書,里面的例子很多,也很詳細,非常適合初學者。如果你想成為一名合格的優化,那么就去學下HTML,不然程序員會認為你什么都不懂在瞎指揮。


          SEO人員應該都知道HTML語言是什么?那么我就來給大家寫一篇SEO和HTML的文章,所以本文就為廣大的seo人員介紹SEO必須懂的HTML代碼標簽。總體來說,SEO人員大部分情況下并不需要直接參與網站程序的編寫,所以,我們只需要能看懂一部分html代碼,并且在工具的輔助下,能夠增、改、刪這9個標簽就可以了。


          二:SEO人員必須懂的HTML語言代碼

          1.標題標簽:如果我們不知道網頁的標題是由哪個標簽來控制的,是一件很失敗的事情。曾與一位朋友交流其站點的優化問題,我對他說頁面的標題要優化一下,標題的寫法最好是“文章標題-欄目名稱-網站名稱”的結構,結果他將正文的標題修改了。這充分說明這位朋友并 懂標題標簽,所以不知道如何去修改頁面標題。而頁面標題對于搜索引擎來說是非常重要的,所以我們 作為SEO人員,一定要會使用標題標簽。


          2.頁面關鍵詞標簽:作為SEO人員,所有的工作內容都是在做與關鍵詞相關的工作,所以我們千萬不能將這個標簽忽略了。對于常見有兩種錯誤:

          a. 沒有使用頁面關鍵詞標簽:通過源碼,我們可以發現很多網站其實沒有這個標簽。沒有此標簽的網站,大部分情況是因為CMS程序不支持,而有些則是因為不明 白它的作用,所以沒有添加。不論是那種情況,我們都可以通過某些方法來改進。
          b. 關鍵詞分隔符號使用不正確:關鍵詞內容的正確形式是【content=“關鍵詞,關鍵詞2,……”】,關鍵詞與關鍵詞之間使用英文半角逗號分隔開來,而不是使用下劃線、豎線或者空格等符號。


          3.頁面描述標簽:此標簽可以看著是定義文章的主要內容,與標題一樣,搜索引擎會將其顯示在搜索結果頁中。所以我們千萬不要忽略,甚至于我們可以利用這一點來將一些促銷和利好信息展示給搜索者,描述的寫法可以參見我們之前的文章。


          4.默認地址標簽:在某些情況下,我們的網站會被某些人惡意復制,造成網站排名下降和權重流失等損失,為了在一定程度上防御這種復制帶來的后果,很 多SEO人員提出在外鏈接中使用絕對url的方法。實際上除了使用絕對地址,我們還可以使用默認地址標簽,使用了默認地址標簽的頁面,其頁內所有的相對url地址所指定的url作為基準,進行鏈接。同時,在此也提醒一下建站的朋友,如果使用了默認地址標簽,在修改各種包含文件--如css,js等引用文件--的時候,要去掉默認地址標簽,否則修改本地文件是無效的,因為它會默認去調用href指定的文件。


          5.文字加粗標簽:這兩組html標簽在 視覺效果上都是讓文字加粗,都有強調的作用,它會告訴用戶和搜索引擎,這部分內容在本頁面是很重要的。所以我們在頁面中可以將重要的詞組--一般是關鍵 詞,進行或加粗強調。但是要避免通篇都是加粗,或者 通篇都沒有詞組被加粗,這兩種方式都是不可取的。大部分情況下,使用或者效果是類似的,有專家 提出使用字符更少、更能節約帶寬,所以建議將都換 成,但顯然這個理由并不是那么充分和吸引人,幾個字符,對于現在的福鼎網絡速度來說,完全可以忽略不計。


          6.內容最大標題標簽:被包含的內容,搜索引擎會給予很高的權重,所以作為SEO人員,一定要重視這一點。并且要記住:是用來定義正文內容最大標題,而不是頁面標題,不要與混淆。同時,一個頁面只允許有一個標簽,否則會被認為是作弊--目前來說是這樣的,HTML5擁有更強的功 能,允許一個頁面有多個標簽,但目前還未完全被搜索引擎所支持,所以我們堅持在一個頁面使用一個是沒錯的。


          7.內容次級標題標簽:一篇文章,除了標題,還會有各種次級段落標題,比如本文:就存在多個次級標題。一般建議,頁面必須有和標簽,和標簽不作要求,也不建議使用及更次級的標簽,因為作用不大,但 不阻止使用,因為他們是文檔的標準標簽,即使無用,也無害。


          8.超鏈接標簽:作為SEO人員,這個HTML標簽是必須懂的,在互聯網中超鏈接標簽可以說是靈魂一般的存在,如果 沒有超鏈接標簽,網站將失去意義。不管我們是做錨文本,還是做圖片鏈接,都需要使用它。這里我們要注意它的兩個屬性,一個是【target】,它決定了鏈接以何種方式打開,一般站內鏈接會被定義為在當前頁面打開,外部鏈接被定義為在新窗口中打開。另外一個屬性是【rel】,其最讓SEO人員關注的就是【Nofollow】值,因為它代表不傳遞權重。對內可以集中權重,不使其分散到無意義的頁面;對外,可以防止權重流失和避免被騙友情鏈接。


          9.圖片標簽:圖片標簽我們要注意的是其【alt】屬性,因為搜索引擎并不認識圖片,而【alt】屬性則在大概意義上告訴了搜索引擎此圖片的內容。 所以,作為SEO人員,一定要重視【alt】屬性的使用,對每一幅具有實際意義的圖片都應該加上【alt】屬性,并為其指定內容。在大多數瀏覽器中,定義 了【alt】屬性內容的圖片,當鼠標懸停在圖片上的時候,會顯示【alt】屬性值:鼠標懸停顯示【alt】屬性值


          另外兩個屬性【widht】和【height】用來定義圖片的寬度和高度,大部分情況下,很多程序編寫人員都是忽略,讓瀏覽器自行判斷圖片的大小。 這種做法在圖片的顯示上面是沒有什么錯誤的,但是忽略【width】和【height】屬性,會增加圖片顯示的時間,所以我們應該主動給圖片加上寬度和高 度屬性,并指定其值。


          關注本頭條(常州姜東),帶您詳細了解SEO培訓優化十四步:(如何做出一個好的SEO效果)


          1、做SEO優化第0步:你真的了解SEO優化嗎?淺談網站優化之用戶體驗優化

          2、做SEO優化第一步:初步了解SEO的作用

          3、做SEO優化第二步:背熟所有SEO基礎名詞

          4、做SEO優化第三步:學習了解HTML基礎知識
          5、做SEO優化第四步:學會搭建一個個人網站(cms系統)

          6、做SEO優化第五步:定位目標關鍵詞和長尾關鍵詞
          7、做SEO優化第六步:設置Title、keywords和Description

          8、做SEO優化第七步:如何選擇網站程序模版?

          9、做SEO優化第八步:如何設置網站目錄優化?
          10、做SEO優化第九步:如何設置頁面內容優化

          11、做SEO優化第十步:內容源找尋和網站更新維護方法
          12、做SEO優化第十一步:如何設置外部鏈接優化

          13、做SEO優化第十二步:網站優化推廣方案
          14、做SEO優化第十三步:一定要最好用戶體驗優化


          業圖片

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>Document</title>
              <style>
                  h1{
                      text-shadow: 5px 5px 5px #FF0000
                  }
              </style>
          </head>
          <body>
              <h1>王耶浪Web開發學習筆記</h1>
          </body>
          </html>

          (1)word-wrap 用來強制換行。

          其語法格式為:

          word-wrap: normal|break-word;

          屬性值說明:

          • normal:只在允許的斷字點換行(瀏覽器保持默認處理)。
          • break-word:在長單詞或 URL 地址內部進行換行。

          例子,

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>Document</title>
              <style>
                  div{
                      width:300px;
                      border: 1px solid rgb(179, 126, 223);
                      word-wrap: break-word;
                  }
              </style>
          </head>
          <body>
              <div>
                  “The bad news is time flies. The good news is you're the pilot.” - Michael Altshuler
              </div>
          </body>
          </html>

          (2)word-break 屬性也是用來強制換行的。

          其語法為:

          word-break: normal|break-all|keep-all;

          取值說明:

          描述

          normal

          使用瀏覽器默認的換行規則。

          break-all

          允許在單詞內換行。

          keep-all

          只能在半角空格或連字符處換行。

          例子,

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>Document</title>
              <style>
                  div{
                      margin-top: 40px;
                  }
                  #text1{
                      border: 1px solid rgb(179, 126, 223);
                      width:100px;
                      word-break: break-all;
                  }
                  #text2{
                      border: 1px solid rgb(179, 126, 223);
                      width:100px;
                      word-break: keep-all;
                  }
              </style>
          </head>
          <body>
              <div id="text1">
                  “The bad news is time flies. The good news is you're the pilot.” - Michael Altshuler
              </div>
              <div id="text2">
                  “The bad news is time flies. The good news is you're the pilot.” - Michael Altshuler
              </div>
          </body>
          </html>

          (3)練習:挑戰一下,word-break

          在前面的內容中,我們已經學習過關于 word-break 屬性的使用了。這里我們來挑戰一下自己吧!

          知識點

          • word-break 屬性

          挑戰準備

          創建一個html 文件,并寫入如下所示 HTML 頁面框架。

          <!DOCTYPE html>
          <html lang="en">
            <head>
              <meta charset="UTF-8" />
              <meta name="viewport" content="width=device-width, initial-scale=1.0" />
              <title>Document</title>
            </head>
            <body></body>
          </html>

          實驗要求

          1. 新建一個 html 文件。
          2. 頁面上有兩對同級的 p 標簽,分別添加類選擇器為:test1test2
          3. 設置 test1 的樣式為:寬為 9em,邊框的粗細為 1px,邊框顏色為黑色,背景顏色為 aquamarine,只能在半角空格或連字符處換行。
          4. 設置 test2 的樣式為:寬為 9em,邊框的粗細為 1px,邊框顏色為黑色,背景顏色為 darkgreen,允許在單詞內換行。

          驗證測試

          按以上要求用 HTML 完成以下效果:


          主站蜘蛛池模板: 亚洲制服丝袜一区二区三区| 在线精品亚洲一区二区小说| 91精品一区二区三区在线观看| 深夜福利一区二区| 精品欧洲av无码一区二区14| 亚洲国产精品无码久久一区二区| 亚洲福利视频一区| 少妇精品无码一区二区三区| 国产午夜精品一区二区三区漫画| 少妇无码一区二区三区| 3d动漫精品啪啪一区二区中文| 一区二区中文字幕| 最新欧美精品一区二区三区| 国产大秀视频一区二区三区| 成人区人妻精品一区二区不卡网站| 无码人妻一区二区三区在线| 国产成人精品久久一区二区三区| 国产成人精品亚洲一区| 亚洲毛片αv无线播放一区| 精品国产一区二区三区| 中文国产成人精品久久一区| 久久精品一区二区三区AV| 一区国严二区亚洲三区| 麻豆天美国产一区在线播放| 日韩精品国产一区| 亚洲国产日韩一区高清在线| 在线观看一区二区三区视频| 99国产精品一区二区| 另类国产精品一区二区| 国精品无码A区一区二区| 亚洲av无码片vr一区二区三区| 精品国产一区二区三区久久蜜臀| 精品人妻AV一区二区三区 | 一区二区三区在线免费看| 国产成人精品亚洲一区| 精品无码一区二区三区电影| 熟女少妇精品一区二区| 精品久久综合一区二区| 激情内射亚洲一区二区三区| 国产精品一区二区久久精品无码| 日本高清一区二区三区|