簡體   English   中英

使用Beautiful Soup和Python解析元標記

[英]parsing meta tag with Beautiful Soup and Python

我使用Beautiful Soup 3和python 2.6解析HTML頁面時遇到問題。

HTML內容是這樣的:

content='<div class="egV2_EventReportCardLeftBlockShortWidth">
<span class="egV2_EventReportCardTitle">When</span>
<span class="egV2_EventReportCardBody">
<meta itemprop="startDate" content="2012-11-23T10:00:00.0000000">
<span class='egV2_archivedDateEnded'>STARTS</span>Fri 23 Nov,10:00AM<br/>
<meta itemprop="endDate" content="2012-12-03T18:00:00.0000000">
<span class='egV2_archivedDateEnded'>ENDS</span>Mon 03 Dec,6:00PM</span>
<span class="egV2_EventReportCardBody"></span>
<div class="egV2_div_cal" onclick=" showExportEvent()">
<div class="egV2_div_cal_outerFix">
<div class="egV2_div_cal_InnerAdjust"> Cal </div>
</div></div></div>'

我想把字符串'11月23日星期五,10:00AM'從中間變成一個變量,用於連接,然后發送回PHP頁面。

要閱讀此內容,我使用以下代碼:(以上內容來自html頁面閱讀(http://everguide.com.au/melbourne/event/2012-nov-23/life-with-bird-spring - 倉儲 - 銷售/)

import urllib2
req = urllib2.Request(URL)
response = urllib2.urlopen(req)
html = response.read()
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html.decode('utf-8'))
soup.prettify()
import re
for node in soup.findAll(itemprop="name"):
    n = ''.join(node.findAll(text=True)) 
for node in soup.findAll("div", { "class" : "egV2_EventReportCardLeftBlockShortWidth" }):
    d = ''.join(node.findAll(text=True))
print n,"|", d

哪個回報:

[(ssh user)]# python testscrape.py

LIFE with BIRD Spring Warehouse Sale | 
When
<span class="egV2_EventReportCardDateTitle">STARTS</span>
STARTSFri 23 Nov,10:00AMENDSMon 03 Dec,6:00PM
<span class="egV2_EventReportCardDateTitle">ENDS</span>



 Cal 



[(ssh user)]# 

(它包括所有這些換行等)。

因此,您可以在最后看到,我將這兩個被剝離的字符串分組到一個打印輸出中,在PHP的中間有一個分隔符,可以將字符串讀回一個,然后將其拆分。

問題是 - python代碼可以讀取該頁面並存儲文本,但它包含所有那些混亂PHP應用程序的垃圾和標簽等。

我真的只想回來:

Fri 23 Nov,10:00AM

是因為我使用findAll(text = True)方法?

如何向下鑽取並僅獲取該div中的文本 - 而不是span標簽?

非常感謝任何幫助,謝謝。

里克 - 墨爾本。

為什么不嘗試類似的東西

In [95]: soup = BeautifulSoup(content)

In [96]: soup.find("span", {"class": "egV2_archivedDateEnded"})
Out[96]: <span class="egV2_archivedDateEnded">STARTS</span>

In [97]: soup.find("span", {"class": "egV2_archivedDateEnded"}).next
Out[97]: u'STARTS'

In [98]: soup.find("span", {"class": "egV2_archivedDateEnded"}).next.next
Out[98]: u'Fri 23 Nov,10:00AM'

甚至

In [99]: soup.find("span", {"class": "egV2_archivedDateEnded"}).nextSibling
Out[99]: u'Fri 23 Nov,10:00AM'

如果您只是嘗試提取一個易於使用特定屬性標識的單個標記,則pyparsing會使這非常簡單(我會使用其ISO8601時間字符串值繼續使用元標記):

from pyparsing import makeHTMLTags,withAttribute

meta = makeHTMLTags('meta')[0]
# only want matching <meta> tags if they have the attribute itemprop="startDate"
meta.setParseAction(withAttribute(itemprop="startDate"))

# scanString is a generator that yields (tokens,startloc,endloc) triples, we just 
# want the tokens
firstmatch = next(meta.scanString(content))[0]

現在轉換為datetime對象,可以按照您喜歡的方式進行格式化,寫入數據庫,用於計算經過時間等:

from datetime import datetime
dt = datetime.strptime(firstmatch.content[:19], "%Y-%m-%dT%H:%M:%S")

print (firstmatch.content)
print (dt)

打印:

2012-11-23T10:00:00.0000000
2012-11-23 10:00:00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM