[英]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.