【Python學(xué)習(xí)】No.7 爬蟲(chóng)相關(guān)

1.XPath中的text()和string()區(qū)別

  • 本質(zhì)區(qū)別
    text()是一個(gè)node test,而string()是一個(gè)函數(shù),data()是一個(gè)函數(shù)且可以保留數(shù)據(jù)類型。此外,還有點(diǎn)號(hào)(.)表示當(dāng)前節(jié)點(diǎn)。
  • 使用要點(diǎn)
    XML例子:
<book><author>Tom John</author></book>
image.png
XML例子:

1. <book>
2. <author>Tom <em>John</em> cat</author>
3. <pricing>
4. <price>20</price>
5. <discount>0.8</discount>
6. </pricing>
7. </book>


text()
經(jīng)常在XPath表達(dá)式的最后看到text(),它僅僅返回所指元素的文本內(nèi)容。

1. let $x := book/author/text()
2. return $x

返回的結(jié)果是Tom cat,其中的John不屬于author直接的節(jié)點(diǎn)內(nèi)容。


string()
string()函數(shù)會(huì)得到所指元素的所有節(jié)點(diǎn)文本內(nèi)容,這些文本講會(huì)被拼接成一個(gè)字符串。

1. let $x := book/author/string()
2. return $x

返回的內(nèi)容是”Tom John cat”


data()
大多數(shù)時(shí)候,data()函數(shù)和string()函數(shù)通用,而且不建議經(jīng)常使用data()函數(shù),有數(shù)據(jù)表明,該函數(shù)會(huì)影響XPath的性能。

1. let $x := book/pricing/string()
2. return $x

返回的是200.8

1. let $x := book/pricing/data()
2. return $x

這樣將返回分開(kāi)的20和0.8,他們的類型并不是字符串而是xs:anyAtomicType,于是就可以使用數(shù)學(xué)函數(shù)做一定操作。

1. let $x := book/pricing/price/data()
2. let $y := book/pricing/discount/data()
3. return $x*$y

比如上面這個(gè)例子,就只能使用data(),不能使用text()或 string(),因?yàn)閄Path不支持字符串做數(shù)學(xué)運(yùn)算。

總結(jié)
text()不是函數(shù),XML結(jié)構(gòu)的細(xì)微變化,可能會(huì)使得結(jié)果與預(yù)期不符,應(yīng)該盡量少用,data()作為特殊用途的函數(shù),可能會(huì)出現(xiàn)性能問(wèn)題,如無(wú)特殊需要盡量不用,string()函數(shù)可以滿足大部分的需求。

2.Xpath 常用函數(shù)

  • contains (): //div[contains(@id,'in')] ,表示選擇id中包含有’in’的div節(jié)點(diǎn)
  • text():由于一個(gè)節(jié)點(diǎn)的文本值不屬于屬性,比如“<a class=”baidu“ href=”http://www.baidu.com“>baidu</a>”,所以,用text()函數(shù)來(lái)匹配節(jié)點(diǎn)://a[text()='baidu']
  • last():前面已介紹
  • starts-with(): //div[starts-with(@id,'in')] ,表示選擇以’in’開(kāi)頭的id屬性的div節(jié)點(diǎn)
  • not()函數(shù),表示否定,//input[@name=‘identity’ and not(contains(@class,‘a(chǎn)’))] ,表示匹配出name為identity并且class的值中不包含a的input節(jié)點(diǎn)。 not()函數(shù)通常與返回值為true or false的函數(shù)組合起來(lái)用,比如contains(),starts-with()等,但有一種特別情況請(qǐng)注意一下:我們要匹配出input節(jié)點(diǎn)含有id屬性的,寫(xiě)法如下://input[@id],如果我們要匹配出input節(jié)點(diǎn)不含用id屬性的,則為://input[not(@id)]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容