猿问

如何使用 Beautiful Soup 从 HTML 中提取特定的脚本元素

我正在使用 BS4 从足球统计页面提取信息。我是这样开始的:


from bs4 import BeautifulSoup as bs

import requests


res = requests.get(url)

soup = bs(res.content, 'lxml')

scripts = soup.find_all('script')

scripts = [script for script in scripts]

这成功地将所有脚本元素作为列表返回。


我需要提取特定的脚本元素


具体来说,其开头如下:


 <script>

    var teamsData = JSON.parse('\x7B\x2271\x22\x3A\x7B\x22id\x22\x3A\x2271\x22,\x22title\x22\x3A\x22Aston\x20Villa\x22,\x22history\x22\x3A\x5B\x5D\x7D,\x2272\x22\x3A\x7B\x22id\x22\x3A\x2272\x22...

</script>

我尝试了以下代码的各种迭代,但输出始终打印为空白:


for script in scripts: 

    if 'teamsData' in script.text: 

        print(script)

我总是可以简单地使用“print(scripts[2])”,但我想知道为什么我最初的努力失败了。


喵喵时光机
浏览 148回答 2
2回答

缥缈止盈

显然,.text脚本标签始终为空字符串。但是,您可以从以下位置获取标签的内容.childrenfrom bs4 import BeautifulSoupfrom io import StringIOhtml = """<script>let a = "Hello";</script>"""b = StringIO(html)soup = BeautifulSoup(b, 'lxml')for e in soup.find_all('script'):&nbsp; &nbsp; print(repr(e.text))&nbsp; &nbsp; print(repr(''.join(e.children)))

杨__羊羊

您可以使用以下方式.string访问<script>字符串:import reimport jsonfrom bs4 import BeautifulSouphtml_doc = '''<script>&nbsp; &nbsp; var teamsData = JSON.parse('\x7B\x2271\x22\x3A\x7B\x22id\x22\x3A\x2271\x22,\x22title\x22\x3A\x22Aston\x20Villa\x22,\x22history\x22\x3A\x5B\x5D\x7D,\x2272\x22\x3A\x7B\x22id\x22\x3A\x2272\x22\x7D\x7D');</script>'''soup = BeautifulSoup(html_doc, 'html.parser')script_string = soup.find('script').stringprint(script_string)印刷:var teamsData = JSON.parse('{"71":{"id":"71","title":"Aston Villa","history":[]},"72":{"id":"72"}}');要解析JSON数据,可以使用re/ jsonmodules。例如:data = re.search(r"JSON\.parse\('(.*?)'\);", script_string).group(1)data = json.loads(data)for k, v in data.items():&nbsp; &nbsp; print(k, v)印刷:71 {'id': '71', 'title': 'Aston Villa', 'history': []}72 {'id': '72'}
随时随地看视频慕课网APP

相关分类

Python
我要回答