سؤال

أنا باستخدام جوجل لمحرك تطبيقات api

from google.appengine.api import urlfetch

لجلب صفحة ويب.نتيجة

result = urlfetch.fetch("http://www.example.com/index.html")

هو سلسلة من محتوى html (في النتيجة.المحتوى).المشكلة هي البيانات التي ترغب في تحليل ليس في شكل HTML, لذلك أنا لا أعتقد باستخدام بيثون HTML محلل العمل بالنسبة لي.لا تحتاج إلى تحليل كل نص عادي في الجسم من مستند html.المشكلة الوحيدة هي أن urlfetch بإرجاع سلسلة واحدة كاملة وثيقة HTML ، وإزالة جميع أسطر و مسافات إضافية.

تحرير: حسنا لقد حاولت جلب URL مختلف و على ما يبدو urlfetch لا تجريد أسطر ، كان الأصلية صفحة ويب كنت أحاول تحليل أن تقدم ملف HTML بهذه الطريقة...نهاية تحرير

إذا كان المستند هو شيء من هذا القبيل:

<html><head></head><body>
AAA 123 888 2008-10-30 ABC
BBB 987 332 2009-01-02 JSE
...
A4A       288        AAA
</body></html>

النتيجة.المحتوى سيكون هذا بعد urlfetch يجلب ذلك:

'<html><head></head><body>AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA</body></html>'

باستخدام HTML محلل لن تساعد لي مع البيانات بين العلامات الجسم, لذلك أنا ذاهب إلى استخدام العادية expresions تحليل البيانات ، ولكن كما ترون الجزء الأخير من خط واحد يحصل جنبا إلى جنب مع الجزء الأول من السطر التالي, وأنا لا أعرف كيفية تقسيمه.حاولت

result.content.split('\n')

و

result.content.split('\r')

ولكن القائمة الناتجة كانت فقط 1 عنصر.أنا لا أرى أي خيارات في جوجل urlfetch وظيفة إزالة الأسطر الجديدة.

أي أفكار كيف يمكن تحليل هذه البيانات ؟ ربما أنا بحاجة إلى جلب بشكل مختلف ؟

شكرا مقدما!

هل كانت مفيدة؟

المحلول

أنا أفهم أن صيغة الوثيقة هي واحدة كنت قد نشرت.في هذه الحالة أوافق على أن محلل مثل شوربة جميلة قد لا يكون حلا جيدا.

افترض أن كنت بالفعل الحصول على بيانات مثيرة للاهتمام (بين العلامات الجسم) مع التعبير العادي مثل

import re
data = re.findall('<body>([^\<]*)</body>', result)[0]

ثم ، ينبغي أن يكون سهلا كما:

start = 0
end = 5
while (end<len(data)):
   print data[start:end]
   start = end+1
   end = end+5
print data[start:]

(ملاحظة:لم تحقق هذه المدونة ضد الحدود الحالات وأنا لا أتوقع أن تفشل.ومن هنا تظهر فكرة عامة)

نصائح أخرى

اقتراح الوحيد الذي يمكنني أن أفكر في أن تحليل ذلك كما لو أنه قد عرض ثابت من الأعمدة.أسطر لا تؤخذ بعين الاعتبار HTML.

إذا كان لديك عنصر تحكم مصدر البيانات إلى ملف نصي بدلا من HTML.

مرة واحدة لديك نص واحد ، سلسلة طويلة ، يمكن تقسيمها على النحو التالي.ويفترض هذا أن كل سجل 26 حرفا.

body= "AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA"
for i in range(0,len(body),26):
    line= body[i:i+26]
    # parse the line

تحرير:القراءة والفهم هو شيء مرغوب فيه.لقد غاب قليلا عن الخطوط التي يجري تشغيلها جنبا إلى جنب مع عدم وجود فاصل بينهما ، والتي قد تكون نوعا ما المغزى من هذا, أليس كذلك ؟ لذا فما باللك جوابي انها ليست في الواقع ذات الصلة.


إذا كنت تعرف أن كل خط 5 مساحة-فصل الأعمدة ، ثم (مرة واحدة كنت قد جردت من html) هل يمكن أن تفعل شيئا مثل (لم تختبر):

def generate_lines(datastring):
    while datastring:
        splitresult = datastring.split(' ', 5)
        if len(splitresult) >= 5:
            datastring = splitresult[5]
        else:
            datastring = None
        yield splitresult[:5]

for line in generate_lines(data):
    process_data_line(line)

بالطبع يمكنك تغيير تقسيم الحرف و عدد الأعمدة حسب الحاجة (ربما حتى يمر بهم إلى مولد وظيفة معلمات إضافية), وإضافة معالجة الخطأ عند الاقتضاء.

المزيد من الاقتراحات من أجل تقسيم السلسلة s في 26 حرف كتل:

قائمة:

>>> [s[x:x+26] for x in range(0, len(s), 26)]
['AAA 123 888 2008-10-30 ABC',
 'BBB 987     2009-01-02 JSE',
 'A4A     288            AAA']

كما مولد:

>>> for line in (s[x:x+26] for x in range(0, len(s), 26)): print line
AAA 123 888 2008-10-30 ABC
BBB 987     2009-01-02 JSE
A4A     288            AAA

محل range() مع xrange() في بيثون 2.x إذا s طويلة جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top