with - Extrahieren von Text aus dem Skript-Tag mit BeautifulSoup in Python




python scrape website (2)

Könnten Sie mir bitte mit diesem kleinen Ding helfen? Ich suche E-Mail, Telefon und Namen Wert aus dem untenstehenden Code in SCRIPT-Tag (nicht in Körper) mit Beautiful Suppe (Python). Ich bin neu in Python und Blog empfehlen, Schöne Suppe zum Extrahieren zu verwenden.

Ich habe versucht, Seite mit dem folgenden Code zu bekommen -

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

Dieser Ajax-Anforderungscode wiederholt sich nicht auf der Seite. Können wir auch schreiben versuchen und fangen, so dass, wenn es nicht auf der Seite gefunden wird, wird es keinen Fehler werfen.

<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: '[email protected]', 
                phone: '9999999999', 
                name: 'XYZ'
            }
        });
    });
});

Sobald ich das bekomme, möchte ich auch in einer Excel-Datei speichern.

Danke im Voraus.


Alternativ zum regexbasierten Ansatz können Sie den JavaScript-Code mit dem slimit Modul slimit , das einen abstrakten slimit und Ihnen die Möglichkeit gibt, alle Zuweisungen zu erhalten und sie in das Wörterbuch slimit :

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: '[email protected]',
                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

Drucke:

{u'name': u"'XYZ'", u'url': u"'http://www.example.com'", u'type': u'"POST"', u'phone': u"'9999999999'", u'data': '', u'email': u"'[email protected]'"}

Unter anderem gibt es email , name und phone , an denen Sie interessiert sind.

Ich hoffe, das hilft.


Sie können den Inhalt des script Tags über BeautifulSoup abrufen und dann eine Regex anwenden, um die gewünschten Daten zu erhalten.

Arbeitsbeispiel (basierend auf dem, was Sie in der Frage beschrieben haben):

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: '[email protected]',
                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']

Drucke:

[email protected].com 9999999999 XYZ

Ich mag die Lösung nicht wirklich, da dieser Regex-Ansatz sehr fragil ist. Alle möglichen Dinge können passieren, die es brechen würden. Ich denke immer noch, dass es eine bessere Lösung gibt und uns hier ein größeres Bild fehlt. Die Bereitstellung eines Links zu dieser spezifischen Website würde viel helfen, aber es ist, was es ist.

UPD (Korrektur des Codes OP vorausgesetzt):

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']

Drucke:

[email protected].com 9999999999 Shamita Shetty




urllib2