Python 2.7
Pycharm 5.0.3
問題
再寫一個markdown自動引用的小腳本的時候新出現(xiàn)的問題懂缕,也就是利用xpath取出字符串的問題漱逸,記錄一下
取出如下字符串
我要取出mrlevo520的內(nèi)容正勒,怎么取呢,很多方法票编,bs4也可以,正則也可以妄迁,動態(tài)selenium也可以,這次我想嘗試用xpath來做李命,一則是為了和selenium接軌登淘,xpath的確很強大,二來是firefox提供firebug插件封字,可以直接定位你需要內(nèi)容的標簽黔州,一步到位簡直完美,不多說阔籽,上程序流妻。
import urllib2
from lxml import etree
crawl_url = "http://www.reibang.com/p/e2c4ebd2eeb3"
req = urllib2.Request(crawl_url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
html = response.read()
selector = etree.HTML(html)
# 核心部分
bloger = selector.xpath("http://a[@class='author-name blue-link']")
info = bloger[0].xpath('string(.)').encode('utf-8').strip()
print info #打印出mrlevo
網(wǎng)上的方法
ok,我們來試下笆制,用小哥改進的方法取出上面那個標簽
# 修改-核心部分绅这,其余保持一樣
bloger = selector.xpath("http://a[@class='author-name blue-link']")
print bloger[0].xpath('string(.)').extract()[0]
ok,又報錯了
AttributeError: '_ElementStringResult' object has no attribute 'extract'
查看類型在辆,如小哥所說证薇,的確是list,再查看列表
print type(bloger) # list
print type(bloger[0]) #'lxml.etree._Element'
print (bloger[0]) # <Element a at 0x36e9208>
# ok匆篓,這要取出bloger[0]里面的字符串就可以了
再次修改代碼浑度,去掉extract(),并去掉周圍空格
# 核心部分
bloger = selector.xpath("http://a[@class='author-name blue-link']")
print bloger[0].xpath('string(.)').strip()
# ok奕删,取值成功
對于小哥的例子俺泣,取出來之后字符串片段使用連接字符串(join)就可以了(可能都不需要join,我沒試過)
總結(jié)
查閱多很博客完残,大家抄的抄伏钠,也不去做驗證,我相信簡書小哥是驗證過的谨设,其余的熟掂,,扎拣,額赴肚,但是簡書小哥@向右奔跑貌似對我的例子并不成立,我也母雞了二蓝,還是自己調(diào)試誉券,所以,希望我們能幫到你刊愚,這些方法你都可以試試踊跟。
BTW
如果對于單標簽定位足夠精確了,那么取出文本還可以用text的方法我們來看一下鸥诽;
采用text的方法
import urllib2
from lxml import etree
crawl_url = "http://blog.chinaunix.net/uid-28266791-id-5754271.html"
req = urllib2.Request(crawl_url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
html = response.read()
selector = etree.HTML(html)
# 核心部分
bloger = selector.xpath("http://div[@class='Blog_left']/div/div/p/a")[0].text.encode('utf-8').strip()
print bloger #打印出夏寥寥
我們一般認為text的方法能夠取出一個標簽下的所有文本商玫,其實不然箕憾,即使那個文本在其標簽下(次級標簽)想要定位范圍稍微放寬,text的方法就不再適用拳昌,也就是說袭异,我想要取出一個一級標簽下的所有內(nèi)容,如果有二級標簽炬藤,三級標簽御铃,那么想要一下子把所有內(nèi)容都取出來,只能靠string(.)的方法了