假如:css 選擇其中如果div元素下面有子節點a 和孫節點 imag
1: 如果要選擇imga 可以用('div imag') 但是不能用('div > imag') 這其中『 』 和 『>'的區別就是 『 』是選擇其所有的後輩節點,但是『>』只是選擇兒子節點。
2:選擇div下面的第二個a標籤可以用 ('div a:nth-child(2)')
對比xpath中的'/『僅僅指子元素不包括孫節點,可用』//『取所有後輩節點。選擇div下面的第二個a標籤可以用 ('div/a[2]')
同時需要注意,如果選擇其中涉及到多個樣式需要用到或的時候,css中沒有或的用法,需要做判斷,相對來說,用xpath的』|『比較簡單。
3:xpath根據文字內容查詢標籤
target="_blank">python的崛起,百萬程式設計師被影響?真相……根據部分內容匹配到這個a標籤的xpath語法:"//a[contains(text(),"python的崛起")]",這樣就可以匹配到了
4:xpath語法中contains的用法
//div[contains(@class,"td-01")]5:乙個標籤包含的屬性包含多個值的時候。表示
class
屬性中含有td-01
的div
標籤
要取到上面所有的關注者人數和被瀏覽人數:
'//div[@class=「numberboard questionfollowstatus-counts numberboard--divider」]/div[1]//strong/text()'
』//div[contains(@class, "numberboard") and contains(@class, "questionfollowstatus-counts") and contains(@class, "numberboard-divider")]/div[1]//strong/text()'
css方式:css('.numberboard.questionfollowstatus-counts.numberboard--divider div strong::text')
補充:這裡只想取到關注著人數的時候用css('.numberboard.questionfollowstatus-counts.numberboard--divider div:nth-child(1) .numberboard-itemvalue::text')無效,瀏覽人數和關注人數都取出來了。
在知乎提取話題瀏覽人數與關注人數的時候,用xpath方式:提取關注人數:
response.xpath(』//div[contains(@class, "numberboard") and contains(@class, "questionfollowstatus-counts") and contains(@class, "numberboard-divider")]/div[1]//strong/text()')
提取瀏覽人數:
response.xpath(』//div[contains(@class, "numberboard") and contains(@class, "questionfollowstatus-counts") and contains(@class, "numberboard-divider")]/div[2]//strong/text()')
此方式在shell 中用scrapy shell進入網頁時候可以提取成功,但是放到scrapy中執行之後就少了乙個字段,然後改用css方法如下:
提取關注人數:
response.css('.numberboard.questionfollowstatus-counts.numberboard--divider div:nth-child(1) .numberboard-iteminner .numberboard-itemvalue::text')
提取瀏覽人數:
response.css('.numberboard.questionfollowstatus-counts.numberboard--divider div:nth-child(2) .numberboard-iteminner .numberboard-itemvalue::text')
同樣在shell中試了都可以提取出來,但是scrapy中的時候item欄位的值提取的一樣,都是瀏覽人數。
6: xpath選擇乙個同時含有多個標籤的屬性用』and『
books/book[@author='john' and @year='2009' and @language='en']
選擇class="c",並且包含id屬性的標籤。
response.css('div.c[id]')相當於xpath:
response.xpath('//div[@class="c" and @id]')
//input[starts-with(@name,'name1')] 查詢name屬性中開始位置包含'name1'關鍵字的頁面元素css選擇其 src 屬性中包含 "abc" 子串的每個 元素//input[contains(@name,'na')] 查詢name屬性中包含na關鍵字的頁面元素
a[src*="abc"]選擇文字中包含「難得的大集合,」的標籤
response.xpath('//*[contains(text(),"難得的大集合,")]')特殊的如下:
電子賬戶這幾個字沒有被乙個明確的標籤包裹。此時再用//ul[@id='side-menu']/li/a[contains(text(),"電子賬戶")]表示式就到不到了.不過可以借助
string()
, 將a標籤裡邊的東西全部轉換成字串, 再用contains()
判斷:
//ul[@id='side-menu']/li/a[contains(string(), '電子賬戶')]選擇文字包含「下頁」的a標籤的href連線
response.css('a:contains("下頁")::attr(href)')from scrapy import selector
target = """[熱門]
ohmy金雨
: 回覆
@edward-9
:人生到底有沒有收穫
舉報贊[33]
回覆04月23日 17:45 來自網頁
"""selector = selector(text=target)
print(selector.css('a:nth-child(1)::text').extract()) # 原以為是找到第乙個 a標籤下面的文字即 「
ohmy金雨」,結果不是。
print(selector.css('a:nth-child(2)::text').extract()) # 此選擇也不是第二個 a標籤下的文字,而是後代標籤的第乙個。分析:之前一直以為css中的nth-child(n)和xpath中的[n]是一樣的道理,其實並不是,花了整整2個小時的實踐才知道並不是這樣的。輸出結果:
['@edward-9', '贊[33]', '回覆']
['ohmy金雨']
**中的 a:nth-child(1) 實際上意思是找到所有後代節點中作為第乙個子節點的a標籤,如果第乙個後代節點不是a標籤則不返回。而不是後代標籤中的第乙個a標籤,
當用 print(selector.css(':nth-child(2)').extract())的時候是就找到所有的作為第二個子節點存在的標籤。輸出:
['ohmy金雨', '
']response.css('div.c[id]')
jquery1 3關於選擇器的一些注意點
目前在使用jquery1.3的時候,發現有些做法和網上寫的已經有了一定的差異。目前發現的有 1 選擇器 1 選擇一組radio中被選中的radio 網上的寫法 input type radio checked 正確的寫法 input radio name channelsels checked tr...
jquery1 3關於選擇器的一些注意點
目前在使用jquery1.3的時候,發現有些做法和網上寫的已經有了一定的差異。目前發現的有 1 選擇器 1 選擇一組radio中被選中的radio 網上的寫法 input type radio checked 正確的寫法 input radio name channelsels checked tr...
關於JQuery的選擇器
1.id 根據給定的id來匹配元素 如果選擇器包含特殊字元,可以用兩個斜槓表示轉義 比如 查詢id為 mydiv 的元素 mydiv 這樣寫就可以查詢到所有id為 mydiv 的元素了。2.element 根據元素名來匹配所有元素 比如 查詢所有div元素就可以這樣寫 div 3.根據給定的類來匹配...