سؤال

أحاول تحليل علامة العنوان في خلاصة RSS 2.0 إلى ثلاثة متغيرات مختلفة لكل إدخال في تلك الخلاصة.باستخدام ElementTree، قمت بالفعل بتحليل RSS حتى أتمكن من طباعة كل عنوان [مطروحًا منه الجزء اللاحق )] بالكود أدناه:

feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date")

for item in feed:  
 print repr(item.title[0:-1])

لقد قمت بتضمين ذلك لأنه، كما ترون، فإن item.title هو نوع بيانات repr()، والذي لا أعرف الكثير عنه.

على وجه الخصوص repr(item.title[0:-1]) printيبدو ed في النافذة التفاعلية كما يلي:

'randy travis (Billy Bobs 3/21'
'Michael Schenker Group (House of Blues Dallas 3/26'

يختار المستخدم نطاقًا وأتمنى ذلك بعد تحليل كل منهما item.title إلى 3 متغيرات (واحد لكل من الفرقة والمكان والتاريخ...أو ربما مصفوفة أو لا أعرف...) حدد فقط تلك المتعلقة بالنطاق المحدد.ثم يتم إرسالها إلى جوجل للترميز الجغرافي، ولكن هذه قصة أخرى.

لقد رأيت بعض الأمثلة على regex وأنا أقرأ عنها، ولكن يبدو الأمر معقدًا للغاية.فعلا؟اعتقدت أنه ربما يكون لدى شخص ما هنا بعض الأفكار حول كيفية القيام بذلك بطريقة ذكية.هل يجب أن أستخدم re وحدة؟هل يهم أن الإخراج هو حاليا repr()س؟هل هناك طريقة أفضل؟كنت أفكر في أنني سأستخدم حلقة مثل (وهذا هو برنامج pseudoPython الخاص بي، وهو مجرد نوع من الملاحظات التي أكتبها):

     list = bandRaw,venue,date,latLong  
     for item in feed:  
      parse item.title for bandRaw, venue, date  
       if bandRaw == str(band)   
        send venue name + ", Dallas, TX" to google for geocoding  
        return lat,long  
      list = list + return character + bandRaw + "," + venue + "," + date + "," + lat + "," + long  
     else  

في النهاية، أحتاج إلى أن تكون الإدخالات المختارة في ملف ‎.csv (مفصول بفواصل) تبدو كما يلي:

band,venue,date,lat,long  
randy travis,Billy Bobs,3/21,1234.5678,1234.5678  
Michael Schenker Group,House of Blues Dallas,3/26,4321.8765,4321.8765

آمل ألا يكون هذا كثيرًا لطرحه.سأبحث في الأمر بمفردي، فقط اعتقدت أنني يجب أن أنشر هنا للتأكد من الرد عليه.

لذا، السؤال هو، كيف يمكنني تحليل كل منها بشكل أفضل repr(item.title[0:-1]) في ال feed في القيم الثلاث المنفصلة التي يمكنني بعد ذلك تسلسلها في ملف بتنسيق ‎.csv؟

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

المحلول

لا تدع الخوف رجإكس قبالة لكم ... انها تستحق التعلم.

وبالنظر إلى الأمثلة أعلاه، قد حاولت وضع قوسين زائدة مرة أخرى، ومن ثم استخدام هذا النمط:

import re
pat = re.compile('([\w\s]+)\(([\w\s]+)(\d+/\d+)\)')
info = pat.match(s)
print info.groups()

('Michael Schenker Group ', 'House of Blues Dallas ', '3/26')

لتحصل على كل فرد مجموعة، مجرد دعوة لهم على الكائن info:

print info.group(1) # or info.groups()[0]

print '"%s","%s","%s"' % (info.group(1), info.group(2), info.group(3))
"Michael Schenker Group","House of Blues Dallas","3/26"

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

ونمط فوق ينهار على النحو التالي، الذي تم توزيعه من اليسار إلى اليمين:

و([\w\s]+): بحث عن أي كلمة أو مساحة حرفا (رمز زائد يشير إلى أن يجب أن يكون هناك واحد أو أكثر من هذه الأحرف). يعني الأقواس أن المباراة سوف يتم القبض كمجموعة. هذا هو "مايكل شينكر المجموعة" جزء. إذا يمكن أن يكون هناك أرقام وشرطات هنا، فأنت تريد أن تعديل القطع بين قوسين معقوفين، التي هي الشخصيات المحتملة لمجموعة.

و\(: A قوسين الحرفي. مائل يهرب القوس، وإلا يكون ذلك ضروريا كأمر رجإكس. هذا هو "(" جزء من السلسلة.

و([\w\s]+): نفس واحدة فوق، ولكن هذه المرة يطابق "بيت البلوز دالاس" جزء. بين قوسين حتى انهم سوف يتم القبض باسم المجموعة الثانية.

و(\d+/\d+): مباريات أرقام 3 و 26 بخط مائل في الوسط. بين قوسين حتى انهم سوف يتم القبض باسم المجموعة الثالثة.

و\): إغلاق قوسين لأعلى

وومقدمة الثعبان إلى التعابير المنطقية هو جيد جدا، وكنت قد ترغب في قضاء أمسية الذهاب أكثر من ذلك <وأ href = "http://docs.python.org/library/re.html#module-re" يختلط = "noreferrer نوفولو"> http://docs.python.org/library/re.html#module-re . أيضا، تحقق من الغوص في بيثون، التي لديها مقدمة ودية: http://diveintopython3.ep.io /regular-expressions.html.

وتحرير: انظر zacherates أدناه، الذي لديه بعض التعديلات لطيفة. اثنين من رؤساء أفضل من واحد!

نصائح أخرى

تعد التعبيرات العادية حلاً رائعًا لهذه المشكلة:

>>> import re
>>> s  = 'Michael Schenker Group (House of Blues Dallas 3/26'
>>> re.match(r'(.*) \((.*) (\d+/\d+)', s).groups()
('Michael Schenker Group', 'House of Blues Dallas', '3/26')

كملاحظة جانبية، قد ترغب في إلقاء نظرة على محلل التغذية العالمي للتعامل مع تحليل RSS نظرًا لأن الخلاصات لديها عادة سيئة تتمثل في التشوه.

يحرر

بالنسبه لتعليقك...السلاسل التي يتم تغليفها أحيانًا بـ "s" بدلاً من "s" لها علاقة بحقيقة أنك تستخدم repr.عادةً ما يتم تحديد تكرار السلسلة بـ 's، ما لم تحتوي هذه السلسلة على واحد أو أكثر من 's، حيث تستخدم بدلاً من ذلك 's بحيث لا يلزم هروب 's:

>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"

لاحظ أنماط الاقتباس المختلفة.

وفيما يتعلق بالجزء repr(item.title[0:-1])، ولست متأكدا من اين حصلت على هذا من ولكن أنا متأكد يمكنك ببساطة استخدام item.title. كل ما تفعلونه هو إزالة شار الماضي من السلسلة ثم استدعاء repr() على ذلك، الذي لا يفعل شيئا.

والتعليمات البرمجية الخاصة بك ينبغي أن ننظر بشيء من هذا القبيل:

import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()

import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)

lines = []
for entry in feed.entries:
    m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)  
    if m:
        bandRaw, venue, date = m.groups()

        if band == bandRaw:
            place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
            lines.append(",".join([band, venue, date, lat, lng]))

result = "\n".join(lines)

تعديل : في استبدال list مع lines كاسم فار. list هو المضمن، وينبغي ألا تستخدم اسم متغير. عذرا.

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