Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由于无法选择表id属性,如何使用BeautifulSoup刮表?_Python_Html_Beautifulsoup - Fatal编程技术网

Python 由于无法选择表id属性,如何使用BeautifulSoup刮表?

Python 由于无法选择表id属性,如何使用BeautifulSoup刮表?,python,html,beautifulsoup,Python,Html,Beautifulsoup,我对HTML和网页抓取非常陌生。我一直在尝试从以下链接中删除表元素: 我想做的是提取诸如总营业额、总市值等要素。当我检查时,所有这些要素都存在 让我困惑的是,当我创建BeautifulSoup对象并使用 turn180329 = requests.get('https://www.hkex.com.hk/Mutual-Market/Stock-Connect/Statistics/Hong-Kong-and-Mainland-Market-Highlights?sc_lang=en#select

我对HTML和网页抓取非常陌生。我一直在尝试从以下链接中删除表元素:

我想做的是提取诸如总营业额、总市值等要素。当我检查时,所有这些要素都存在

让我困惑的是,当我创建BeautifulSoup对象并使用

turn180329 = requests.get('https://www.hkex.com.hk/Mutual-Market/Stock-Connect/Statistics/Hong-Kong-and-Mainland-Market-Highlights?sc_lang=en#select3=0&select2=2&select1=28')
turnsoup = bs4.BeautifulSoup(turn180329.text,'lxml')`

`file180329 = open('180329.txt','wb')
for char in turn180329.iter_content(1000000):
    file180329.write(char)
file180329.close()
我可以选择div[class=table container fixed freeze tb parent]来返回div元素,但是当我使用

turn\u table=turnsoup。查找所有“tbl\u 0.table-container fixed freeze tb parent”

提取任何所需的表元素


万分感激和感谢任何能帮助我的人

这是因为在执行请求时,表中的数据不在html源中。您可以使用浏览器检查网站的请求。在这种情况下,我可以检测到网站请求将数据发送到url:


这将以json格式返回表的数据。

站点似乎是动态的,即前端脚本在浏览器打开时使用后端的值更新DOM。要从动态站点进行刮取,您需要使用浏览器操作工具,如selenium:

输出:

[[u'No. of listed companies', u'1,827', u'352', u'1,406', u'51', u'2,096', u'49'], [u'No. of listed H shares', u'230', u'24', u'n.a.', u'n.a.', u'n.a.', u'n.a.'], [u'No. of listed red-chips stocks', u'158', u'6', u'n.a.', u'n.a.', u'n.a.', u'n.a.'], [u'Total no. of listed securities', u'13,527', u'353', u'n.a.', u'n.a.', u'n.a.', u'n.a.'], [u'Total market capitalisation(Bil. dollars)', u'HKD 34,139', u'HKD 264', u'RMB 32,376', u'RMB 91', u'RMB 23,008', u'RMB 74'], [u'Total negotiable capitalisation (Bil. dollars)', u'n.a.', u'n.a.', u'RMB 27,500', u'RMB 91', u'RMB 16,580', u'RMB 73'], [u'Average P/E ratio (Times)', u'12.42', u'42.23', u'17.72', u'21.42', u'32.89', u'11.06'], [u'Total turnover (Mil. shares)', u'232,780', u'1,769', u'17,027', u'22', u'19,244', u'13'], [u'Total turnover (Mil. dollars)', u'HKD 137,287', u'HKD 821', u'RMB 210,972', u'RMB 158', u'RMB 268,838', u'RMB 72'], [u'Total market turnover(Mil. dollars)', u'HKD 138,108', u'RMB 213,189', u'RMB 268,910']]

正如@Juan Javier Santos Ochoa所说,浏览器实际上发送另一个URL,服务器用JSON数据响应该URL。下面是代码部分来补充他的答案

可以修改此URL中的日期部分TDD=29、TMM=3、TYYYY=2018,以获得不同日期的结果:

url = 'https://www.hkex.com.hk/eng/csm/ws/Highlightsearch.asmx/GetData?LangCode=en&TDD=29&TMM=3&TYYYY=2018'
感谢@Keyur Potdar指出不需要发送头

以下是发送请求并获取JSON的行:

r = requests.get(url)
d = r.json()
结果如下:

# Turnover (Mil. shares) - Main Board, GEM
>>> print(d['data'][9]['td'][1])
['232,780', '1,769']
编辑:

您可以使用在线服务来理解JSON对象的结构。
如果您添加代码以显示如何从所显示的URL中刮取数据,您的答案将更加完整。此URL不需要任何标题。另外,我认为您应该在代码中添加行d=r.json,我猜您可能正在使用它;如果没有,请使用这个内置的JSON解析器。
# Turnover (Mil. shares) - Main Board, GEM
>>> print(d['data'][9]['td'][1])
['232,780', '1,769']