使用BeautifulSoup解析时,HTML标记显示为空,但在浏览器中打开时,HTML标记具有内容

时间:2015-10-10 20:17:01

标签: javascript python html beautifulsoup

通过BS4解析html页面时遇到问题。我在html页面中有一个隐藏的div,我想用BeautifulSoup读取内容。其内容由javascript函数动态生成,该函数通过body onload触发。

问题是:当我在浏览器中调用该页面时,该标记具有应该具有的内容。当我通过BS4解析同一页面时,标签为空。

我找不到任何有关BS4无法处理onload javascript生成内容的信息,所以不确定这里可能出现的问题。

Python脚本:

import urllib.request
from bs4 import BeautifulSoup

import time
import datetime
eT = time.time()

version = 1
vNum = str(version)

t = datetime.datetime.now()

d = "0" + str(t.day)
#d = d.rstrip()
d = d[-2:]
m = "0" + str(t.month)
#m = m.rstrip()
m = m[-2:]
y = str(t.year)

dStr = y + m + d

resultFile = 'output/classAndIdList-' + dStr + '-v' + vNum + '.txt'
pageListFile = 'input/quickListFR.txt'
f = open(pageListFile, mode='r', encoding='utf-8')

urlRoot = 'http://dev.example.com/'

fOut = open(resultFile, 'w')
ciList = []

# for url in urls.split('\n'):
for l in f:
    u = l.rstrip()  
    url = urlRoot + u
    html_content = urllib.request.urlopen(url)
    time.sleep(1)
    html_text = html_content.read()
    soup = BeautifulSoup(html_text)
    ciTag = soup.find(id="testDivCSS")
    print(ciTag)
    ciString = ciTag.get_text()
    # print(ciString)
    ciArray = ciString.split(',')
    # print(ciArray)
    for c in ciArray:
        if c not in ciList:
            ciList.append(c)
            fOut.write(c + '\n')
            print(c)
    print(u + '... DONE')       
fOut.close()

通过BeautifulSoup的示例结果页面:

Example-page-1.html... DONE
<div id="testDivCSS" style="display: none;"> </div>

浏览器中的div(表示php和javascript部分工作正常):

<div id="testDivCSS" style="display: none;">div#menu_rightup,div#social,div#sidebar,div#specific,div#menu_rightdown,div#footer</div>

1 个答案:

答案 0 :(得分:2)

BeautifulSoup无法通过javascript处理动态生成内容。 您可以使用浏览器自动化工具(例如selenium)来帮助获取整个页面(包括动态部分),然后使用BeautifulSoup来解析页面。

参考这个问题: How to retrieve the values of dynamic html content using Python