我试图提取具有重复模式的HTML的某些特定部分。
模式看起来像这样:
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_01",
"id": "00000001"
});
});
</script>
不幸的是,这个HTML里面有很多JavaScript,我只对上述模式感兴趣。使用BeatifulSoup库,我可以使用find.All
功能获取HTML中的所有“ javascript” :
soup.findAll('script', attrs={"type": "text/javascript"})
但是,如何仅提取这些特定模式?我想获得此“ dict”作为结果:
({"Status":"true",
"description":"sku_01",
"id": "00000001"
})
谢谢
您可以使用.find()
withtext=
参数,然后使用re
/json
模块来解码数据。
例如:
import re
import json
from bs4 import BeautifulSoup
txt = '''
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_01",
"id": "00000001"
});
});
</script>'''
soup = BeautifulSoup(txt, 'html.parser')
# locate the <script>
t = soup.find('script', text=lambda t: 'ProductsList' in t).contents[0]
# get the raw string using `re` module
json_data = re.search(r'itemJS\.ProductsList\((.*?)\);', t, flags=re.DOTALL).group(1)
# decode the data
json_data = json.loads(json_data)
# print the data to screen
print(json.dumps(json_data, indent=4))
印刷品:
{
"Status": "true",
"description": "sku_01",
"id": "00000001"
}
编辑:如果您有多个<scipt>
标签,您可以执行以下操作:
import re
import json
from bs4 import BeautifulSoup
txt = '''
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_01",
"id": "00000001"
});
});
</script>
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_02",
"id": "00000002"
});
});
</script>
'''
soup = BeautifulSoup(txt, 'html.parser')
for script_tag in soup.find_all('script', text=lambda t: 'ProductsList' in t):
json_data = re.search(r'itemJS\.ProductsList\((.*?)\);', script_tag.contents[0], flags=re.DOTALL).group(1)
json_data = json.loads(json_data)
print(json.dumps(json_data, indent=4))
打印:
{
"Status": "true",
"description": "sku_01",
"id": "00000001"
}
{
"Status": "true",
"description": "sku_02",
"id": "00000002"
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句