HTML 标签在用 BeautifulSoup 解析时显示为空,但在浏览器中打开时有内容
HTML tag appears empty when parsing it with BeautifulSoup but has content when opened in browser
我在通过 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>
BeautifulSoup 无法处理 javascript 动态生成的内容。
你可以先使用浏览器自动化工具(如selenium)帮助获取整个页面(包括动态部分),然后使用BeautifulSoup解析页面。
参考这个问题:
How to retrieve the values of dynamic html content using Python
我在通过 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>
BeautifulSoup 无法处理 javascript 动态生成的内容。 你可以先使用浏览器自动化工具(如selenium)帮助获取整个页面(包括动态部分),然后使用BeautifulSoup解析页面。
参考这个问题: How to retrieve the values of dynamic html content using Python