我有这个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
我认为这是因为我在a
标记
你能帮我吗?
答案 0 :(得分:2)
问题在于您检查bordR
课程的方式。 class
是一个多值空格分隔属性,您必须考虑元素上的其他类。在XPath中,您应该使用“contains”:
.//td[contains(@class, 'bordR')]
或者,更可靠的是add "concat" to the partial match check。
找到元素后,您可以使用.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
要更进一步,您可以load the date string into a datetime
object:
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)
答案 1 :(得分: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'