簡體   English   中英

我如何用lxml解析html

[英]how can i parse html with lxml

我有這個HTML:

<td class="name-td alLeft bordR">13.10.2016, Thu<span class="sp">|</span>17:00</td>

我想獲取一個日期(13.10.2016)和一個時間(17:00)。

我正在這樣做:

t = lxml.html.parse(url)
nextMatchDate = t.findall(".//td[@class='bordR']")[count].text

但是遇到錯誤

IndexError: list index out of range

我想這是因為我有一個HTML標簽a標簽

請問你能幫幫我嗎?

問題在於您檢查bordR類的方式。 class是用空格分隔的多值屬性,您必須考慮元素上的其他類。 在XPath中,您應該使用“包含”:

.//td[contains(@class, 'bordR')]

或者,甚至更可靠的方法是將“ concat”添加到部分匹配檢查中

找到元素后,就可以使用.text_content()方法獲取包括所有子元素的完整文本:

In [1]: from lxml.html import fromstring

In [2]: data = '<td class="name-td alLeft bordR">13.10.2016, Thu<span class="sp">|</span>17:00</td>'

In [3]: td = fromstring(data)

In [4]: print(td.text_content())
13.10.2016, Thu|17:00

要更進一步,您可以將日期字符串加載到datetime對象中

In [5]: from datetime import datetime
In [6]: datetime.strptime(td.text_content(), "%d.%m.%Y, %a|%H:%M")
Out[6]: datetime.datetime(2016, 10, 13, 17, 0)

有一種稱為.itertext的方法,該方法是:

遍歷子樹的文本內容。

所以,如果你有一個元素td在變量td ,你可以這樣做:

>>> text = list(td.itertext()); text
['13.10.2016, Thu', '|', '17:00']

>>> date, time = text[0].split(',')[0], text[-1]

>>> datetime_text = '{} at {}'.format(date, time)

>>> datetime_text
'13.10.2016 at 17:00'

暫無
暫無

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

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