我正在尝试使用 BeautifulSoup 在JavaScript中提取setAttribute
元素中的值。我尝试使用正则表达式,但它返回None
。
script
标记如下
<script>
var iframe = document.createElement('iframe');
iframe.setAttribute("src", "Value i need to get");
iframe.frameBorder=0;
iframe.scrolling="no";
iframe.width="300px";
iframe.height="24px";
document.getElementById("m_iframe").appendChild(iframe);
</script>
Python代码:
html=url.read()
soup=BeautifulSoup(html,"html.parser")
p = re.compile('\s+iframe.setAttribute("src",\s+"(.*)");')
all_script = soup.find_all("script", {"src":False})
for individual_script in all_script:
all_value = individual_script.string
if all_value:
m = p.match(all_value)
print m
我的代码有什么问题?
如何获得这个价值?
答案 0 :(得分:1)
关于你的正则表达式,问题是你没有转义setAttribute函数的括号,所以它只是将它们视为捕获组。试试这个正则表达式:`\ s + iframe.setAttribute(“src”,\ s +“(。*)”);'
如果你正在进行正则表达式刮擦,你根本不应该真的需要BeautifulSoup ...这样的事情就足够了:
html = url.read()
r = re.compile(r'\s+iframe\.setAttribute\("src",\s+"(.*)"\);')
match = r.match(html)
if match:
print match.group()
答案 1 :(得分:1)
您可以使用简单的拆分来提取您想要的文本,我经常使用它,因为我对正则表达式不太好。
from bs4 import BeautifulSoup
html = """
<html>
<script>
var iframe = document.createElement('iframe');
iframe.setAttribute("src", "Value i need to get");
iframe.frameBorder=0;
iframe.scrolling="no";
iframe.width="300px";
iframe.height="24px";
document.getElementById("m_iframe").appendChild(iframe);
</script>
</html>
"""
start = 'iframe.setAttribute("src", "'
end = '");'
soup = BeautifulSoup(html, 'html.parser')
cols = soup.findAll('script')
for i in cols:
text_you_need = ((i.text.split(start))[1].split(end)[0])
print(text_you_need)
你得到你想要的东西:
Value i need to get
您可以使用相同的代码段来获取两个字符串之间的文本,这涵盖了我打算进行抓取的大部分内容。
答案 2 :(得分:1)