我怎么能用lxml解析html

时间:2016-10-11 16:11:11

标签: python html parsing

我有这个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标记

中有html标记

你能帮我吗?

2 个答案:

答案 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'