谷歌瀏覽器直接提取的xpath,在python中為什麼無法提取相應內容?
# -*- coding: utf-8 -*-
from lxml import etree
import requests
url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2014/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"}
html=requests.get(url,headers=headers)
html.encoding="GBK"
selector = etree.HTML(html.text)
content=selector.xpath("//html/body/table[2]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr/td/a/text()")
for each in content:
print each
什麼都列印不出來,請高人指點吶
你的xpath寫的太長了吧,很容易出錯的
內容的tr的class都是provincetr,用這個篩選容易多了,//tr[@class="provincetr"]/td/a/text()
xpath不熟悉,看了下wiki寫出來的,寫的不好
因為瀏覽器對不標準的HTML文檔都有糾正功能,而lxml不會
查看page source,注意是源代碼,不是developer tool那個;最後一個table並沒有包含tbody,瀏覽器會自動補充tbody,而lxml沒有這麼做,所以你的xpath沒有找到
from lxml import etree
import requests
url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2014/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"}
html=requests.get(url,headers=headers)
html.encoding="GBK"
selector = etree.HTML(html.text)
nodes=selector.xpath("//tr[@class="provincetr"]/node()")
for each in nodes:
print(each.xpath("string()"))
另一種寫法,算是對 @Yong Hong答案的補充吧,當td下的text消息是不規則時可以這麼用
用了這麼多的爬蟲,不同語言的爬蟲,只有scrapy的文檔裡面說了chrome拷貝的xpath裡面會添加多餘的tbody。這個問題卡了我好久,換了好幾個爬蟲,甚至自己寫爬蟲的地步,原因是對於chrome太信任了。
所以就一直用scrapy了,我相信它的文檔裡面肯寫明tbody這個事情,證明這個工具用的人實在是太多了,能遇到的問題都能解決。這麼說吧,同樣的URL瀏覽器會載入js事件,所以瀏覽器和python爬蟲類requests打開同樣的URL獲取的源碼肯定是不一樣的,你拷貝chrome的xpath直接去提取requests的html大部分肯定出問題。
失敗原因一般是多了不存在的tobdy節點、標籤的樣式(id、class)不同、標籤順序不同等。。。
content=selector.xpath("//td[a]//text()")
out:
["北京市",
"天津市",
"河北省",
"山西省",
"內蒙古自治區",
"遼寧省",
"吉林省",
"黑龍江省",
"上海市",
"江蘇省",
"浙江省",
"安徽省",
"福建省",
"江西省",
"山東省",
"河南省",
"湖北省",
"湖南省",
"廣東省",
"廣西壯族自治區",
"海南省",
"重慶市",
"四川省",
"貴州省",
"雲南省",
"西藏自治區",
"陝西省",
"甘肅省",
"青海省",
"寧夏回族自治區",
"新疆維吾爾自治區"]
我也剛遇到這個問題,去掉tbody就行了
推薦閱讀: