借助以下問題的答案:Python: Get html table data by xpath,我正在嘗試從網頁中抓取“股權模式”資訊。這是代碼:
import lxml.html as LH
import pprint
import requests
def screenerdata (symbol):
with requests.Session() as sess:
resp = sess.get('https://www.screener.in/company/' symbol '/consolidated/')
root= LH.fromstring(resp.content)
for tbody in root.xpath('/html/body/main/section[9]/div[2]/table/tbody'):
data = [ [tdata.text_content().replace(u'\xa0', u'').strip()
for tdata in trow.xpath('td')]
for trow in tbody.xpath('//tr') ]
pprint.pprint(data)
screenerdata("LTTS")
由于網頁上的 html 表沒有任何 id 或 class,因此我使用 Mozilla Firefox Web 開發人員工具復制了 xpath。一切都很好,除了代碼也會從其他表中抓取資料。有關如何解決此問題的任何想法。提前致謝
uj5u.com熱心網友回復:
你必須通過xpath訪問嗎?既然是<table>標簽,為什么不讓pandas決議表呢?它將回傳一個資料幀串列(本質<table>上是 html 中的每個標簽。最后一個表是“持股模式”,因此可以只使用 df 串列的索引。
import pandas as pd
def screenerdata (symbol):
url = 'https://www.screener.in/company/' symbol '/consolidated/'
df = pd.read_html(url)[-1]
print(df.to_string())
screenerdata("LTTS")
輸出:
Unnamed: 0 Dec 2018 Mar 2019 Jun 2019 Sep 2019 Dec 2019 Mar 2020 Jun 2020 Sep 2020 Dec 2020 Mar 2021 Jun 2021 Sep 2021
0 Promoters 80.41 78.88 74.97 74.97 74.74 74.62 74.60 74.36 74.27 74.24 74.23 74.15
1 FIIs 4.22 5.09 8.50 8.93 8.26 8.37 8.95 7.97 8.87 9.06 8.92 9.50
2 DIIs 4.25 4.43 4.75 4.76 4.52 4.88 4.45 5.83 6.40 6.36 6.68 6.14
3 Public 11.12 11.60 11.78 11.34 12.48 12.13 12.00 11.83 10.46 10.34 10.17 10.21
uj5u.com熱心網友回復:
這一行是問題:
for trow in tbody.xpath('//tr') ]
您正在“跳上”到 XML 樹的頂部,然后向下查看整個檔案以查找任何和所有tr元素。
您應該將其設為相對運算式.//tr而不是//tr. 這將從tr當前位置(選定的tbody)開始查找任何和所有內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370852.html
