Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.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 BeautifulSoup4无法从此表中刮取数据_Python_Html_Web_Web Scraping_Beautifulsoup - Fatal编程技术网

Python BeautifulSoup4无法从此表中刮取数据

Python BeautifulSoup4无法从此表中刮取数据,python,html,web,web-scraping,beautifulsoup,Python,Html,Web,Web Scraping,Beautifulsoup,很抱歉这个愚蠢的问题,因为我对网页抓取还不熟悉,对HTML等都不了解 我正试图从中提取数据。具体而言,从本页的该部分/表格: 末"四"位数 9775,2275,4775,7275 末"五"位数 03881,23881,43881,63881,83881,16913,66913 末"六"位数 313110,563110,813110,063110 末"七"位数 4210962,9210962,9785582 末"八"位数 63262036 末"九"位数 080876872 很抱歉,这是

很抱歉这个愚蠢的问题,因为我对网页抓取还不熟悉,对HTML等都不了解

我正试图从中提取数据。具体而言,从本页的该部分/表格:

末"四"位数 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>
网下有效申购股数(万股)
 
中签号
中签号公布日期
 2018-02-22 (周四)
我想获取此表的内容:
tr id=“tr_zqh”
(上面的第6行)。但是由于某种原因,它没有刮取数据(下面没有内容)。但是,当我检查网页的源代码时,数据在表中。我不认为这是一个BeautifulSoup4无法处理的动态表。我尝试了
lxml
和html解析器,我尝试了
pandas.read_html
。它返回了相同的结果。我想获得一些帮助,了解它为什么没有获得数据还有我该如何修复它。非常感谢

忘记提到我尝试了
page.find('tr')
,它返回了表的一部分,但没有返回我感兴趣的行。
page.find('tr')
返回屏幕截图的第一行。我想获取第二行和第三行的数据(在屏幕截图中突出显示)

如果从初始页面提取两个变量,您可以使用它们直接向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

从我的角度来看,你的问题对我来说并不清楚。但以下是我所做的

我做了很多网站垃圾,所以我只是做了一个包,让我得到任何网页美丽的汤对象。包是。 所以我的答案取决于这一点。但是你可以看看源代码,发现它并没有什么神秘之处。你可以拖出
制作汤的部分,然后按照你的意愿使用

我们开始吧

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_表。查找所有('td')

输出

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

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

谢谢,@worldssender!我忘了说我试过page.find('tr')。它只返回表的第一行。我附上了一个我感兴趣但在这里找不到的行的截图:。我刚试过page.find(id='tr_zqh')。仍然找不到我感兴趣的行(编号为“9775,2275,4775,7275”)这部分数据实际上是通过javascriptGood to know异步加载的!谢谢,@WorldSEnder!您可能想了解一下嵌入式浏览器的cefpython框架。这将有点复杂,虽然对我来说它看起来很高级,但您可以在Python应用程序中嵌入web浏览器,这真的很酷。谢谢这是一种更复杂的方法,可以获得与OP已经获得的相同的输出。她需要动态值,而您的代码从初始页面返回静态值sourceThanks@Parousia用于共享包!我确实希望获得动态值(数字:'977522754757275'). Thanks@Andersson为了澄清!非常感谢!这正是我想要的!抱歉,还有一个问题:如果我需要浏览2000个类似页面,这是否是最佳代码。我最初的想法是在每个页面上迭代代码,但是它需要连接到服务器4000次。我想知道是否有是更好的方法,或者这已经是最好的方法。任何想法都会有帮助!不幸的是,我找不到API的文档。API可能会在一个请求中返回更多,甚至所有您想要的值,但可能不会。我要做的是比较两个不同请求的API URL并找出差异。然后尝试查询根据不同的API使用不同的方法。