سؤال

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

المجلة الحالية التي أعمل عليها هي الطبيعة ، والمقال الذي كنت أستخدمه حيث يمكن رؤية عينة بلدي في http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html.

لا يمكنني الحصول على الملخص من تلك الصفحة. أنا أبحث عن كل شيء بين <p class="lead">...</p> العلامات ، لكن لا يمكنني معرفة كيفية عزلها. اعتقدت أنه سيكون شيئًا بسيطًا مثل

from BeautifulSoup import BeautifulSoup
import re
import urllib2

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)

abstract = soup.find('p', attrs={'class' : 'lead'})
print abstract

باستخدام Python 2.5 ، BeautifulSoup 3.0.8 ، يدير هذا "لا شيء". ليس لدي أي خيار لاستخدام أي شيء آخر يحتاج إلى تجميعه/تثبيته (مثل LXML). هل جميلة في الخلط أم أنا؟

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

المحلول

أن HTML مشوه إلى حد كبير ، و xml.dom.minidom لا يمكن تحليله ، والتحليل الجميل لا يعمل بشكل جيد.

أزلت بعض <!-- ... --> قطع الغيار والحالة مرة أخرى مع BeautifulSoup ، ثم يبدو أفضل وقادرة على الجري soup.find('p', attrs={'class' : 'lead'})

هذا هو الرمز الذي جربته

>>> html =re.sub(re.compile("<!--.*?-->",re.DOTALL),"",html)
>>>
>>> soup=BeautifulSoup(html)
>>>
>>> soup.find('p', attrs={'class' : 'lead'})
<p class="lead">The class of exotic Jupiter-mass planets that orb  .....

نصائح أخرى

إليك طريقة غير BS للحصول على الملخص.

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
for para in html.split("</p>"):
    if '<p class="lead">' in para:
        abstract=para.split('<p class="lead">')[1:][0]
        print ' '.join(abstract.split("\n"))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top