我正試圖獲得公司名稱,部門和行業的股票。我下載了'https://finance.yahoo.com/q/in?s={}+Industry'.format(sign)
的HTML,然後嘗試用.xpath()
從lxml.html
解析它。這個XPath爲什麼不工作?
要獲取我試圖抓取的數據的XPath,我在Chrome中前往該網站,右鍵單擊該項目,單擊Inspect Element
,右鍵單擊突出顯示的區域,然後單擊Copy XPath
。這在過去一直適用於我。
import requests
from lxml import html
page_p = 'https://finance.yahoo.com/q/in?s=AAPL+Industry'
name_p = '//*[@id="yfi_rt_quote_summary"]/div[1]/div/h2/text()'
sect_p = '//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[2]/tbody/tr/td/table/tbody/tr[1]/td/a/text()'
indu_p = '//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[2]/tbody/tr/td/table/tbody/tr[2]/td/a/text()'
page = requests.get(page_p)
tree = html.fromstring(page.text)
name = tree.xpath(name_p)
sect = tree.xpath(sect_p)
indu = tree.xpath(indu_p)
print('Name: {}\nSector: {}\nIndustry: {}'.format(name, sect, indu))
哪個給出了這樣的輸出:
這個問題可以用下面的代碼(我使用的是蘋果公司爲例)再現
Name: ['Apple Inc. (AAPL)']
Sector: []
Industry: []
它沒有遇到任何下載困難,因爲它能夠檢索name
,但其他兩個不起作用。如果我有tr[1]/td/a/text()
和tr[1]/td/a/text()
取代它們的路徑,分別是返回此:
Name: ['Apple Inc. (AAPL)']
Sector: ['Consumer Goods', 'Industry Summary', 'Company List', 'Appliances', 'Recreational Goods, Other']
Industry: ['Electronic Equipment', 'Apple Inc.', 'AAPL', 'News', 'Industry Calendar', 'Home Furnishings & Fixtures', 'Sporting Goods']
很顯然,我可以只切出來的第一個項目每個列表中獲得我所需要的數據。
我不明白的是,當我添加tbody/
開始(//tbody/tr[#]/td/a/text()
)再次失敗,即使在Chrome控制檯清楚地表明這兩個tr
S作爲是一個tbody
元素的兒童。
爲什麼會出現這種情況?