在xpath中text()和string(.)的區別
我們在進行爬蟲時候,經常會遇到如下這樣的頁面:
你好,北京
在日常抓取的時候,遇到更多的情況是抓取中的你好,這時使用xpath("//div/em/text()")就可以提取到。
現在我們考慮下面兩種抓取需求:
需求1:我們想要提取“,北京”的時候,這個時候該用text(),還是string(.)?
需求2:提取 “你好,北京”呢?
我們先使用lxml庫對頁面進行一下初始化(如果你用的是scrapy的xpath選擇器,也可以按照以下步驟執行):
from lxml import etree
with open('foo.html', 'r') as f:
content = f.read().encode('utf8')
page = etree.HTML(content)
這裡我們先看一下需求1的解法,也就是提取“,北京”:
re = page.xpath("//div/text()")
這裡re得到的是一個陣列:
這是因為在頁面中標籤
和之間是有換行符號的,因此使用"//div/text()"後會忽略掉你好,而剩下"\n",“,北京\n”兩個元素。
我們取re的第二個元素,然後去掉結尾的換行符"\n"(如果你使用的是scrapy的xpath,這裡re得到的可能不是一個陣列):
re = re[1].strip()
這個時候得到的re就是我們需要的",北京"了。
現在看一下第二個需求:提取"你好,北京":
這裡就要求裡面的文字也要提取出來了,這時候我們使用string:
re = page.xpath("//div")[0].xpath("string(.)")
這時來看下re的值(同樣如果你使用的是scrapy的選擇器,scrapy_selector.xpath("//div")返回的結果可能不是一個陣列,不過你只要取到結果然後再使用.xpath("string(.)")即可。):
得到的一整串文字" \n 你好,北京\n "。
看來使用"string(.)"後,xpath會把裡的內容也直接提取出來,而不像上面中"text()"那樣把都去掉後,再分割成一個陣列。這裡注意使用string()時候要把string(.)放在一個xpath中,而不是寫成"//div/string(.)"這樣,否則會抓取不到。
然後,同樣的再去除一下兩邊多餘的空格和換行符
re = re.strip()
這個時候re得到就是”你好,北京“啦。
總結: 無錫人流醫院
透過上述的實驗,我們發現xpath裡面text()只會取當層節點的文字並按照當層的tag進行分割,組成列表。而string(.)會把當層節點以及當層節點以下的所有文字都提取出來,放在一個字串變數中。
例項程式碼:
test.py:
# coding=utf-8
from lxml import etree
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class Test(object):
def __init__(self):
with open('foo.html', 'r') as f:
content = f.read().encode('utf8')
self.page = etree.HTML(content)
print self.page
def xpath_text(self):
re = self.page.xpath("//div/text()")
print re
re = re[1].strip()
print re
return re
def xpath_string(self):
re = self.page.xpath("//div")[0].xpath("string(.)")
print re
# 替換換行符等
re = re.strip(re)
print re
return re
if __name__ == "__main__":
t = Test()
assert t.xpath_text() == u",北京"
assert t.xpath_string() == u"你好,北京"
foo.html:
你好,北京
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2654912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- text/html和text/plain的區別HTMLAI
- Go 中 type var string 和 type var = string 的區別Go
- String和StringBuilder的區別UI
- StringBuilder和String 的區別?UI
- jQuery的html()和text()區別jQueryHTML
- String s = “hello“和String s = new String(“hello“)的區別
- xpath和dom有什麼區別?
- 67. StringBuilder和String 的區別?UI
- String.valueOf和強制型別轉換(String)的區別型別
- Java String.valueOf 和 toString的區別Java
- Rust中 String、str、&str、char 的區別Rust
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- ElasticSearch 中 match、match_phrase、query_string 和 term 的區別Elasticsearch
- 介面和列舉在方法中的區別
- String、StringBuffer、StringBuilder的區別UI
- String、StringBuilder、StringBuffer的區別UI
- String StringBuild StringBuffer的區別UI
- String,StringBuilder,StringBuffer的區別UI
- 在 JavaScript 中,exec() 和 match() 區別JavaScript
- Java中的String,StringBuilder,StringBuffer三者的區別JavaUI
- 在Pandas中 SQL操作:SQLAlchemy和PyMySQL的區別MySql
- String,StringBuffer與StringBuilder的區別UI
- GO語言中string和[]byte的區別及轉換Go
- String、StringBuffer、StringBuilder區別?UI
- String,StringBuffer,StringBuilder區別UI
- jQuery html(),text(),val()區別jQueryHTML
- javascript中string物件方法中的slice、substring、substr的區別聯絡JavaScript物件
- 在js中attribute和property的區別是什麼?JS
- 在Linux中,tomcat和nginx的區別是什麼?LinuxTomcatNginx
- 在Linux中,Jail和Chroot有何區別?LinuxAI
- JavaScript中==和===的區別JavaScript
- Linux中“>”和“>>”的區別Linux
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- mysql中“ ‘ “和 “ ` “的區別MySql
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- mysql中!=和is not的區別MySql