使用Python中的BeautifulSoup从脚本标记中提取文本

时间:2014-08-04 04:26:08

标签: python beautifulsoup urllib2

请你帮我解决这个问题。我希望使用Beautiful soup(Python)从SCRIPT标签(不是Body)中的以下代码中提取电子邮件,电话和名称值。我是Python新手,博客建议使用美丽的汤来提取。

我尝试使用以下代码获取页面 -

fileDetails = BeautifulSoup(urllib2.urlopen('http://www.example.com').read())
results = fileDetails.find(email:")

此Ajax请求代码不再在页面中重复。我们还可以编写try和catch,这样如果它没有在页面中找到它,它就不会抛出任何错误。

<script type="text/javascript" language='javascript'> 
$(document).ready( function (){

   $('#message').click(function(){
       alert();
   });

    $('#addmessage').click(function(){
        $.ajax({ 
            type: "POST",
            url: 'http://www.example.com',
            data: { 
                email: 'abc@g.com', 
                phone: '9999999999', 
                name: 'XYZ'
            }
        });
    });
});

一旦我得到了这个,我也想存储在一个excel文件中。

感谢您的期待。

2 个答案:

答案 0 :(得分:5)

除了基于正则表达式的方法之外,您还可以使用slimit模块解析javascript代码,该模块构建抽象语法树并为您提供获取所有分配并将其放入字典的方法:

from bs4 import BeautifulSoup
from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor


data = """
<html>
    <head>
        <title>My Sample Page</title>
        <script>
        $.ajax({
            type: "POST",
            url: 'http://www.example.com',
            data: {
                email: 'abc@g.com',
                phone: '9999999999',
                name: 'XYZ'
            }
        });
        </script>
    </head>
    <body>
        <h1>What a wonderful world</h1>
    </body>
</html>
"""

# get the script tag contents from the html
soup = BeautifulSoup(data)
script = soup.find('script')

# parse js
parser = Parser()
tree = parser.parse(script.text)
fields = {getattr(node.left, 'value', ''): getattr(node.right, 'value', '')
          for node in nodevisitor.visit(tree)
          if isinstance(node, ast.Assign)}

print fields

打印:

{u'name': u"'XYZ'", u'url': u"'http://www.example.com'", u'type': u'"POST"', u'phone': u"'9999999999'", u'data': '', u'email': u"'abc@g.com'"}

在其他字段中,您感兴趣的是emailnamephone

希望有所帮助。

答案 1 :(得分:2)

您可以通过script获取BeautifulSoup代码内容,然后应用正则表达式来获取所需数据。

工作示例(基于您在问题中描述的内容):

import re
from bs4 import BeautifulSoup

data = """
<html>
    <head>
        <title>My Sample Page</title>
        <script>
        $.ajax({
            type: "POST",
            url: 'http://www.example.com',
            data: {
                email: 'abc@g.com',
                phone: '9999999999',
                name: 'XYZ'
            }
        });
        </script>
    </head>
    <body>
        <h1>What a wonderful world</h1>
    </body>
</html>
"""

soup = BeautifulSoup(data)
script = soup.find('script')

pattern = re.compile("(\w+): '(.*?)'")
fields = dict(re.findall(pattern, script.text))
print fields['email'], fields['phone'], fields['name']

打印:

abc@g.com 9999999999 XYZ

我真的不喜欢这个解决方案,因为这种正则表达式方法非常脆弱。会发生各种破坏它的事情。我仍然认为有一个更好的解决方案,我们在这里错过了更大的图景。提供指向该特定网站的链接会有很大帮助,但它就是这样。


UPD(修复提供的代码OP):

soup = BeautifulSoup(data, 'html.parser')
script = soup.html.find_next_sibling('script', text=re.compile(r"\$\(document\)\.ready"))

pattern = re.compile("(\w+): '(.*?)'")
fields = dict(re.findall(pattern, script.text))
print fields['email'], fields['phone'], fields['name']

打印:

abcd@gmail.com 9999999999 Shamita Shetty