&",html,re.S)for each in c: print each輸出的結果就使得沒有內容的地方被有內容的給佔..." />

python正則表達式抓取數據時,有些標籤下有內容,有些標籤下沒有時怎麼辦?

比如有的&&

有的裡面是沒有的,就像這樣&&
c=re.findall("&<\/private&>&(.*?)]&>&<\/contentDesc&>",html,re.S)
for each in c:
print each
輸出的結果就使得沒有內容的地方被有內容的給佔了,導致和其他項目匹配時順序就亂了
這樣該怎麼處理呢


當然是寫一個正則表達式可以同時匹配有內容或者沒有內容的了……

"&<\/private&>&(.*?)]&>&<\/contentDesc&>"

你這個表達式值匹配中間要求有]&>的,所以空的匹配不到,修改一下

"&<\/private&>&(.*?)&<\/contentDesc&>

就可以同時匹配到空和非空了。還可以寫得更複雜一點:

"&<\/private&>(?:&&&<\/contentDesc&>|&&<\/contentDesc&>|&)"

支持三種不同的格式,用或的方式連接起來,如果不是第一種方式,group(1)就會返回None

簡單說一下用正則表達式而不是XPath或者Selector的理由,最大的理由就是通用性,你要抓的內容有可能是script標籤裡面的一個變數的值,然後script的標籤數量可能還有變化,這你要怎麼辦?還有些情況下根本就寫不出靠譜的XPath表達式,你要抓取貼吧裡面所有「樓上+1」的上一層樓,怎麼寫XPath表達式?另外,某些網頁根本就不是標準的XHTML,有些標籤程序員手一滑就給寫錯了,沒關閉,瀏覽器里可是能正常打開的。用正則表達式的好處就是只要你腦子夠清晰一定可以寫出能用的表達式。當然,缺點是頁面稍微更改一點點可能就不能用了,而且不好維護。


謝邀。

我個人寫爬蟲抓取網頁的經驗並不多,在我有限的經驗里,基本上沒有用過正則來解析網頁,原因有二:

1. 正則不好駕馭
2. 有其他更方便的選擇,如 XPath 或 CSS selector

XPath 可以用 lxml - Processing XML and HTML with Python,很強大的 XML 和 HTML 解析庫。

Selector 可以用 GitHub - gawel/pyquery: A jquery-like library for python ,如果熟悉選擇器和 jQuery 語法,這個庫非常容易上手。

另外,Chrome 瀏覽器對 XPath 和 selector 的支持也很好,在用開發者工具查看源碼時可以直接 copy XPath 或 selector.


s = "&abc&&&&123&"
p = r"&(.*?)&"
m = re.findall(p, s)
print m
# ["abc", "", "123"]

順序並不會亂,不明白你在說什麼。


直接通過正則抓最外面部分,之後通過替換把裡面部分替換了

比如
a s...a
a....a
抓...,直接用正則抓兩個a裡面的內容,在替換s為空。


難道不是抓取自己需要的標籤下的內容就可以了嗎?!


不會啊,應該是沒寫對吧。空的就輸出空了。最好是先抓大,再抓小,這樣準確。或者把抓的放在一個列表裡,輸出看看


個人淺見:這種情況用xpath或者css選擇器比較方便
可以看一看蟲師的selenium相關內容


推薦閱讀:

新手小白請教maya python ?

TAG:Python | 爬蟲計算機網路 | 正則表達式 | Python入門 |