无法获取表数据 - HTML

时间:2017-09-03 14:40:25

标签: html python-2.7 beautifulsoup

我正在尝试从https://www.zacks.com/stock/research/amzn/earnings-announcements

获取“收入通知表”

我正在使用不同的beautifulsoup选项,但没有人拿到桌子。

>set PYTEST_TMPDIR=./tmp
>python.exe -m pytest -q -s test_my_db.py
* c:\tests\tmp\data1_0\db1.db
.* c:\tests\tmp\data2_0\db2.db
.
2 passed in 10.03 seconds

当我检查表格时,表格的元素就在那里。

我正在粘贴我为表格获取的部分代码(js,json?)。

table = soup.find('table', attrs={'class': 'earnings_announcements_earnings_table'})

table = soup.find_all('table')

我怎么能得到这张桌子? 谢谢!

1 个答案:

答案 0 :(得分:0)

所以解决方案是使用Python的字符串和RegExp函数而不是BeautifulSoup来解析整个HTML文档,因为我们不是试图从HTML标记中获取数据,而是希望将它们放在JS代码中。

所以这个代码基本上是把JS数组放在“earnings_announcements_earnings_table”里面,因为JS数组与Python的列表结构相同,我只是用ast解析它。结果是一个列表,你可以循环进入,它显示来自表的所有页面的所有数据。

import urllib2
import re
import ast

user_agent = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'}
req = urllib2.Request('https://www.zacks.com/stock/research/amzn/earnings-announcements', None, user_agent)
source = urllib2.urlopen(req).read()

compiled = re.compile('"earnings_announcements_earnings_table"\s+\:', flags=re.IGNORECASE | re.DOTALL)
match = re.search(compiled, source)
if match:
    source = source[match.end(): len(source)]

compiled = re.compile('"earnings_announcements_webcasts_table"', flags=re.IGNORECASE | re.DOTALL)
match = re.search(compiled, source)
if match:
    source = source[0: match.start()]

result = ast.literal_eval(str(source).strip('\r\n\t, '))
print result

如果您需要澄清,请告诉我。