2010-11-19 19 views
2

Şu anda eski bir bash betiğini benimseme işlevine sahip bir Python betiğine dönüştürme sürecindeyim. Çoğu şeyi yapabildim, ancak Python desen eşleştirmesi ile çok fazla sorun yaşıyorum.Python desen uyumu

Önceki betiğimde, bir web sayfası indirdim ve istediğim öğeyi almak için sed kullanmıştım. Eşleştirme (istediğim değerlerden biri için) şöyle yapıldı:

PM_NUMBER=`cat um.htm | LANG=sv_SE.iso88591 sed -n 's/.*ol.st.*pm.*count..\([0-9]*\).*/\1/p'` 

It "pm olästa" ibaresinden sonra <span class="count"></span> sarılı numarayla aynı olacaktır. Ben bir sürü için soruyorum gibi görünüyor, çünkü bu yazı için tereddüt am

<td style="padding-left: 11px;"> 
    <a href="/abuse_list.php"> 
     <img src="/gfx/abuse_unread.png" width="15" height="12" alt="" title="9 anmälningar" /> 
    </a> 
</td> 
<td align="center"> 
    <a class="page_login_text" href="/pm.php" title="Du har 3 olästa pm."> 
     <span class="count">3</span> 
</td> 
<td style="padding-left: 11px;" align="center"> 
    <a class="page_login_text" href="/blogg_latest.php" title="Du har 1 ny bloggkommentar"> 
     <span class="count">1</span> 
</td> 
<td style="padding-left: 11px;" align="center"> 
    <a class="page_login_text" href="/user_guestbook.php" title="Min gästbok"> 
     <span class="count">1</span> 
</td> 
<td style="padding-left: 11px;" align="center"> 
    <a class="page_login_text" href="/forum.php?view=3" title="Du har 1 ny forumkommentar"> 
     <span class="count">1</span> 
</td> 
<td style="padding-left: 11px;" align="center"> 
    <a class="page_login_text" href="/user_images.php?user_id=162005&func=display_new_comments" title="Du har 1 ny albumkommentar"> 
     <span class="count">1</span> 
</td> 
<td style="padding-left: 11px;" align="center"> 
    <a class="page_login_text" href="/forum_favorites.php" title="Du har 2 uppdaterade trådar i &quot;bevakade trådar&quot;"> 
     <span class="count">2</span> 
</td> 

ama birisi bu ayrıştırmak için bir yol lütfen bana yardımcı olabilir: Ben buna karşı koşuyorum biçimlendirme olduğunu Python? Saçlarımı yapmaya çalışıyorum, ama normal ifadeler ve ben sadece uyuşmuyoruz (pardon). Son birkaç saati, düzenli ifadelerle Python el kitabını denedim ve okuyarak geçirdim, ama bunu anlayamıyorum.

Sadece şunu açıklığa kavuşturmak için, ihtiyacım olan şey <span class="count"></span> içinde numarayı eşleştirmek için 7 farklı ifadedir. Örneğin, okunmamış PM'leri ("olästa pm") bulabilmek için ihtiyacım var.

+4

düzenli ifadeler ve html eşleşmiyor (puntoyu affet) –

cevap

2

Kullanıcı Lxml XPath'lerdeki

ile oldukça kolay Aradığınız değerleri çekmeyi yapabilirsiniz

Örnek

from lxml import html 
page = html.fromstring(open("um.htm", "r").read()) 
matches = page.xpath("//a[contains(@title, 'pm.') or contains(@title, 'ol')]/span") 
print [elem.text for elem in matches] 
+0

Bu umut verici görünüyor. PM'leri olması gerektiği gibi getiriyor. Ancak, diğer değerleri almak için adapte etmekte sorun yaşıyorum. Ben 'pm' yerine diğer değerler (blog yorumları için bloggkommentar gibi) ne olursa olsun ile değiştirilmesi gibi basit olacağını düşündüm.). Ancak, bu herhangi bir eşleşmeyi geri döndürmüyor gibi görünmüyor (bir kere 'ya da' ('@', ')' i içeriyorsa, bu her zaman pm değerini döndürdü (çünkü ilk buydu)). –

+0

Bunu doğru olarak işaretleme. Xpath kullanarak ve bağlantı urllerini kullanarak eşleme güzel çalıştı! Çok teşekkür ederim! –

+0

Yardım için sevindim, xpath ve lxml güçlü xml işleme için –

4

Kendiniz html'yi ayrıştırmayacaksınız. Html ayrıştırmak için python yerleşik bir html çözümleyici kullanacaksınız.

+1

HTML için XML ayrıştırıcısı kullanmazsınız. Javascript üzerinde kırılmayan bir ayrıştırıcı kullanacaksınız (örn. BeautifulSoup). – delnan

+0

Güzel çorbaya potansiyel bir çözüm olarak baktım ama henüz aradığım şeyi nasıl elde edeceğimi anlayamadım. Yine de denemeye devam edeceğim. –

+0

BeautifulSoup, belirli bir şekilde biçimlendirilmiş etiketlerle karşılaştığı zaman, bir tıslama uymasına neden olan eski bir gerilemeden dolayı bir seçenek olmayabilir. Onu ayrıştırmak için ihtiyacım olan html oldukça korkunç, bu da boğulmasına sebep oluyor. –

1

kullanımı: ya regexes ile

ayrıştırma HTML felaket için bir tarifi. HTML'yi düzenli ifadelerle güvenilir bir şekilde eşleştirmek imkansızdır.

1

Belirli bir sayfa için çalışan bir şeyleri bir araya getirmek genellikle mümkündür, ancak kaynak HTML'ye ince bir ince ayar yapmak bile tüm çalışmalarınızı işe yaramaz hale getirebilir. HTML, sadece Regex'in tanımlayabileceğinden daha karmaşık bir yapıya sahiptir.

Uygun çözüm, özel bir HTML ayrıştırıcısı kullanmaktır. XML ayrıştırıcılarının bile ihtiyacınız olanı yapmayacağına ve güvenilir bir şekilde olmayacağına dikkat edin. Geçerli XHTML geçerli bir XML'dir, ancak oldukça benzer olsa da geçerli bir HTML bile değildir. Ve geçerli HTML/XHTML zaten vahşi bulmak neredeyse imkansız.

  • BeautifulSoup standart kütüphanede değil, ama neredeyse hepsi gerçek dünya HTML işleyebilir en bağışlayıcı ayrıştırıcısıdır ve tam yapmak için tasarlanmış:

    birkaç farklı HTML ayrıştırıcılar bulunmamakta Ne yapmaya çalışıyorsun?

  • HTMLParser, Python standart kitaplığında bulunur, ancak yalnızca geçerli HTML'yi kabul etme konusunda oldukça katıdır.
  • htmllib da standart kitaplıktadır, ancak kullanımdan kaldırılmıştır.

Diğer kişilerin önerdiği gibi, BeautifulSoup neredeyse kesinlikle en iyi seçimdir.