Python BeautifulSoup4无法从此表中刮取数据
很抱歉这个愚蠢的问题,因为我对网页抓取还不熟悉,对HTML等都不了解 我正试图从中提取数据。具体而言,从本页的该部分/表格: 末"四"位数 9775,2275,4775,7275 末"五"位数 03881,23881,43881,63881,83881,16913,66913 末"六"位数 313110,563110,813110,063110 末"七"位数 4210962,9210962,9785582 末"八"位数 63262036 末"九"位数 080876872 很抱歉,这是中文的,因为我无法嵌入图片,所以看起来很糟糕。但是,表格大致位于页面的中间(从顶部算起的40个百分点)。表格id是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 很抱歉,这是
'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使用不同的方法。