分享

關於 PyQuery 的一些心得

目前自己在 Python 上習慣用的 HTML parser 是 PyQuery,是一個仿 jQuery 開發的 HTML parser,因此在大部份一般常見情況下都能直接把 jQuery 的 document 拿來參考,包含 selector 也是。 因為原本就對 jQuery 有一點點了解,所以大部份情況用起來算是滿舒適的。
PyQuery PYTHON

Photo by Pankaj Patel on Unsplash

不過用這幾年來多少還是有發現一些問題,感覺可以紀錄一下:
  1. start tag 跟 end tag 沒有成對時無法正確解析
    這算是比較麻煩的點,因為一般常見瀏覽器針對這個問題似乎都有一套容錯方案,所以即便有幾個 start 跟 end tag 沒成對,依然有辦法把畫面順利的產出來;但 parser 在解析的時候可就會遇到問題了,例如在透過 CSS selectors 要取出元素的時候,很可能會取到完全不在你意想範圍內的那些元素,進而導致你的程式出錯。 這種事情偶爾會發生在使用者發文時能編輯一些 HTML code 的論壇網站上,很煩,但完全不是 parser 的錯;解決方式個人目前是沒什麼 idea。但曾試過把沒成對的 start tag node 移除掉,雖然 parse 結果錯誤的問題解了,但畢竟移除網頁原有的元素還是可能導致網頁內容不完全的,所以也不是一個理想的解決方案…
  2. 轉編碼不是很好轉
    有些網站用的可能不是 UTF-8 編碼,像是 ISO-8859-1之類的,這時候直接把 PyQuery parse 後的網頁內容 print 出來就會得到一群亂碼。但 PyQuery 似乎沒辦法針對這點做處理?變成要自己把內容抓出來,先以對應編碼 encode 回去,再以 UTF-8 decode 回 unicode 後再處理,偶爾遇到特殊字元還會噴個錯… (這邊用的是 Python 2,字元編碼還很麻煩,也許 Python 3 就不會遇到這問題?)。 個人解決方式是不要直接把網址作為參數餵給 PyQuery 初始化,而是搭配 requests 套件可以直接設定 encoding 來轉碼的特性,先把 .encoding 設成 UTF-8 後再將其網頁原始碼餵給 PyQuery,就能解決自行轉碼時遇到的奇怪問題。
  3. 可能有部份較進階混用的 selectors 實作不太完全
    個人算是滿常用 css selector 去選出不具有某特定元素或字元的元素,寫的時候會用 :not(:has()) 或是 :not(:contains())來寫,但 PyQuery 就正好在這點沒辦法滿足我的需求,會得到一個 Exception。 當然這問題還是可以解的,先把具有某元素的父元素先移除掉,再用自己原本預期的 selector 去選出需要的網頁元素,只是沒那麼漂亮乾淨就是了。
總的來說,PyQuery 還是個人最常用的 HTML parser,五六年前初接觸 Python 時原本想使用 BeautifulSoup,但它的 selector 完整性在當時不如 Java 的 JSoup 因而棄用。 最近 Python2 慢慢過時,也許轉寫 Python 3 的時候可以再來比較看看各家 parser 或是爬蟲框架哪家比較好用啦!
#PyQuery  #PYTHON 
分類:科技

就是個菜雞工程師~

評論
上一篇
  • 不關機、不拔硬碟擴充VM root 磁碟區 - growpart
  • 更多文章
    載入中... 沒有更多了