BeautifulSoup4无法从此表中抓取数据

时间:2018-03-24 16:34:59

标签: python html web web-scraping beautifulsoup

对于这个愚蠢的问题感到抱歉,因为我不熟悉网页抓取,也不了解HTML等。

我试图从this website抓取数据。具体来说,从页面的这个部分/表格:

enter image description here

末"四"位数9775,2275,4775,7275 末"五"位数03881,23881,43881,63881,83881,16913,66913 末"六"位数313110,563110,813110,063110 末"七"位数4210962,9210962,9785582 末"八"位数63262036 末"九"位数080876872

我很抱歉用中文,因为我无法嵌入图片,所以看起来很糟糕。但是,该表大致位于页面的中间(距离顶部40个百分点)。表ID为'tr_zqh'

这是我的源代码:

import bs4 as bs
import urllib.request

def scrapezqh(url):
    source = urllib.request.urlopen(url).read()
    page = bs.BeautifulSoup(source, 'html.parser')
    print(page)

url = 'http://data.eastmoney.com/xg/xg/detail/300741.html?tr_zqh=1'
print(scrapezqh(url))

它擦除了大部分表格,但是我感兴趣的部分。这是我认为数据应该返回的部分:

<td class="tdcolor">网下有效申购股数(万股)
            </td>
<td class="tdwidth" id="td_wxyxsggs"> 
            </td>
</tr>
<tr id="tr_zqh">
<td class="tdtitle" id="td_zqhrowspan">中签号
            </td>
<td class="tdcolor">中签号公布日期
            </td>
<td class="ltxt" colspan="3"> 2018-02-22 (周四)
            </td>

我想获得此表的内容:tr id="tr_zqh"(上面的第6行)。但由于某种原因,它不会刮掉其数据(下面没有内容)。但是,当我检查网页的源代码时,数据在表中。我不认为它是BeautifulSoup4无法处理的动态表格。我已经尝试了lxml和html解析器,并且我已经尝试了pandas.read_html。它返回了相同的结果。我希望得到一些帮助,以了解它为什么没有获取数据以及我如何解决它。非常感谢!

忘记提及我试过page.find('tr'),它返回了表格的一部分,但不是我感兴趣的行。 Page.find('tr')返回屏幕截图的第1行。我想得到第二个和第二个的数据。第3行(截图中突出显示) enter image description here

2 个答案:

答案 0 :(得分:2)

如果从初始页面中提取几个变量,您可以使用它们直接向api发出请求。然后你得到一个json对象,你可以用它来获取数据。

import requests
import re
import json
from pprint import pprint

s = requests.session()
r = s.get('http://data.eastmoney.com/xg/xg/detail/300741.html?tr_zqh=1')
gdpm = re.search('var gpdm = \'(.*)\'', r.text).group(1)
token  = re.search('http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get\?type=XGSG_ZQH&token=(.*)&st=', r.text).group(1)

url = "http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=XGSG_ZQH&token=" + token + "&st=LASTFIGURETYPE&sr=1&filter=%28securitycode='" + gdpm + "'%29&js=var%20zqh=%28x%29"
r = s.get(url)
j = json.loads(r.text[8:])

for i in range (len(j)):
    print ( j[i]['LOTNUM'])


#pprint(j)

输出:

9775,2275,4775,7275
03881,23881,43881,63881,83881,16913,66913
313110,563110,813110,063110
4210962,9210962,9785582
63262036
080876872

答案 1 :(得分:0)

从我看到的东西,我的问题并不清楚。但这就是我的所作所为。

我做了很多webscraping所以我做了一个包,让我得到任何网页的美丽汤对象。套餐为here。 所以我的答案取决于那个。但是你可以看一下源代码,看看它真的没有什么深奥的东西。您可以拖出soup-making部分并按照自己的意愿使用。

我们走了。

pip install pywebber --upgrade

from pywebber import PageRipper

page = PageRipper(url='http://data.eastmoney.com/xg/xg/detail/300741.html?tr_zqh=1', parser='html5lib')

page_soup = page.soup

tr_zqh_table = page_soup.find('tr', id='tr_zqh')

从这里你可以tr_zqh_table.find_all('td')

tr_zqh_table.find_all('td')

输出

[
<td class="tdtitle" id="td_zqhrowspan">中签号
</td>, <td class="tdcolor">中签号公布日期
</td>, <td class="ltxt" colspan="3"> 2018-02-22 (周四)
</td>
]

进一步了解

for td in tr_zqh_table.find_all('td'):
    print(td.contents)

输出

['中签号\n                ']
['中签号公布日期\n                ']
['\xa02018-02-22 (周四)\n                ']