在爬取網頁時,對網頁數據清洗時常會遇到空格,有的網頁空格類型還不止一種,如果不能正確處理,可能無法提取到需要的數據。這里記錄下自己使用正則處理各種類型空格的經歷。
這里把空格格式分兩類,一類這里表述為普通文本空格,另一類表述為html實體空格。普通文本空格介紹 普通半角空格 和 普通全角空格 。html實體空格介紹三種,分別為 html實體不間斷空格 ( )、 html實體半角空格 ( )和 html實體全角空格 ( )。
這種空格不需要特殊處理,使用正則匹配,可以直接使用空格或者\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類型的,但是直接看不出來,代碼抓取下來可以看到),如下圖所示
以下使用代碼獲取該段文本,并使用正則提取
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碼。
該鏈接 正文之間有很多不間斷空格,打開開發者工具可以直接看到
以下使用代碼獲取該段文本,并使用正則提取
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。
該鏈接 正文末尾的日期前面有很多**&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。
該鏈接 正文表格表頭有一列中有該類型空格, ,如下圖所示
以下使用代碼獲取該段文本,并使用正則提取
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;
屬性值說明:
例子,
<!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 屬性的使用了。這里我們來挑戰一下自己吧!
創建一個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>
按以上要求用 HTML 完成以下效果:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。