BeautifulSoup是一个html解析器;您还需要一个JavaScript解析器。顺便说一句,某些javascript对象文字是无效的json(尽管在您的示例中,文字也是有效的json对象)。
在简单的情况下,您可以:
假设这window.blog...是一行或';'对象内部没有任何内容,并使用简单的字符串操作或正则表达式提取javascript对象文字
假设该字符串是有效的json并使用json模块对其进行解析
#!/usr/bin/env python
html = """
extract javascript object as json
// ..
window.blog.data = {"activity":{"type":"read"}};
// ..
some other html here
import json
import re
from bs4 import BeautifulSoup # $ pip install beautifulsoup4
soup = BeautifulSoup(html)
script = soup.find('script', text=re.compile('window\.blog\.data'))
json_text = re.search(r'^\s*window\.blog\.data\s*=\s*({.*?})\s*;\s*$',
script.string, flags=re.DOTALL | re.MULTILINE).group(1)
data = json.loads(json_text)
assert data['activity']['type'] == 'read'
如果假设不正确,则代码将失败。
为了放松第二个假设,可以使用JavaScript解析器代替正则表达式,例如,slimit(由@approximatenumber建议):
from slimit import ast # $ pip install slimit
from slimit.parser import Parser as JavascriptParser
from slimit.visitors import nodevisitor
soup = BeautifulSoup(html, 'html.parser')
tree = JavascriptParser().parse(soup.script.string)
obj = next(node.right for node in nodevisitor.visit(tree)
if (isinstance(node, ast.Assign) and
node.left.to_ecma() == 'window.blog.data'))
# HACK: easy way to parse the javascript object literal
data = json.loads(obj.to_ecma()) # NOTE: json format may be slightly different
assert data['activity']['type'] == 'read'
无需将对象文字(obj)视为json对象。为了获得必要的信息,obj可以像其他ast节点一样递归访问。它将允许支持任意javascript代码(可由解析slimit)。
2020-12-20
小编典典BeautifulSoup是一个html解析器;您还需要一个JavaScript解析器。顺便说一句,某些javascript对象文字是无效的json(尽管在您的示例中,文字也是有效的json对象)。在简单的情况下,您可以:使用html解析器提取文本假设这window.blog...是一行或';'对象内部没有任何内容,并使用简单的字符串操作或正则表达式提取javascript对象文字假设该字...
一、初识
正则
表达式
正则
表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配快速检索文本、实现替换文本的操作
json
(xml) 轻量级 web 数据交换格式
import re\na='C|C++|Java|C#||
Python
|
Javascript
'
r= re.findall('
Python
',a)
print(r)
if len(r) > 0:
print('字符串
中
包含
Python
')
else:
print('No')
['
Python
']
字符串
中
包含
Python
二、元字符与普通字符
import re
a='C0C++7Java8C#9Py
铁路图生成器
这是一个
使用
SVG 生成铁路图(如
使用
的)的小型库,具有
JS
和
Python
端口。
铁路图是一种以比
使用
正则
表达式或 BNF 更具可读性的形式直观地表示语法的方式。 它们可以轻松表示任何上下文无关文法,以及一些更强大的文法。 有几个铁路图生成器,但它们都没有我想要的视觉吸引力,所以我自己写了一个。
(对于
Python
,请参阅或pip install railroad-diagrams 。)
要
使用
该库,请在
页面
中
包含railroad.css ,并在脚本
中
导入railroad.
js
模
块
,然后调用 Diagram() 函数。 它的参数是图表的组成部分(图表是序列的一种特殊形式)。
每个节点的构造函数在模
块
中
命名为导出; 默认导出是一个只调用构造函数的同名函数的
对象
,因此您可以构建图表而不必到处发送new垃圾邮件:
// Use the construc
有时候,我们可能会遇到数据是以
JSON
字符串的形式包裹在 Script 标签
中
,此时
使用
BeautifulSoup 仍然可以很方便的
提取
。
假设有以下这段
页面
结构:
<script type="application/ld+
json
" id="DATA_INFO">
"user": {
"isLogin": true,
一、强大的BeautifulSoup:BeautifulSoup是一个可以从
html
或xml文件
中
提取
数据的
Python
库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。在
Python
开发
中
,主要用的是BeautifulSoup的查找
提取
功能,修改功能很少
使用
1、安装BeautifulSoup
pip3 install beautifulsoup4
2、安装第三方
html
解析
器lxml
pip3 i.
可以
使用
re模
块
中
的
正则
表达式来
提取
html
文档
中
的
中
文信息。具体方法是先
使用
正则
表达式匹配出所有的
中
文字符,然后再
使用
re.sub()函数将非
中
文字符替换为空格,最后再
使用
strip()函数去除多余的空格即可。以下是示例代码:
import re
html
= """
<title>测试
页面
</title>
</head>
<h1>欢迎来到测试
页面
</h1>
<p>这是一段
中
文文本。</p>
<p>这是另一段英文文本。</p>
</body>
</
html
>
pattern = re.compile('[\u4e00-\u9fa5]+')
chinese_text = ' '.join(re.findall(pattern,
html
)).strip()
print(chinese_text)
输出结果为:这是一段
中
文文本