循环遍历Python lxml

时间:2016-04-02 04:47:37

标签: python xpath lxml

我有以下XPath:

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/text()')

在这个HTML中(某些部分被删除,不是一个大的例子)

... 
<TABLE  CLASS="datadisplaytable" SUMMARY="This layout table is used to present Registration Errors.">
    <TR>
    <TH CLASS="ddheader" scope="col" >Status</TH>
    <TH CLASS="ddheader" scope="col" ><ACRONYM title = "Course Reference Number">CRN</ACRONYM></TH>
    <TH CLASS="ddheader" scope="col" ><ABBR title = Subject>Subj</ABBR></TH>
    <TH CLASS="ddheader" scope="col" ><ABBR title = Course>Crse</ABBR></TH>
    <TH CLASS="ddheader" scope="col" ><ABBR title = Section>Sec</ABBR></TH>
    <TH CLASS="ddheader" scope="col" >Level</TH>
    <TH CLASS="ddheader" scope="col" ><ABBR title = "Credit Hours">Cred</ABBR></TH>
    <TH CLASS="ddheader" scope="col" >Grade Mode</TH>
    <TH CLASS="ddheader" scope="col" >Title</TH>
    </TR>
    <TR>
    <TD CLASS="dddefault">DUPLICATE <ACRONYM title = "Course Reference Number">CRN</ACRONYM></TD>
    <TD CLASS="dddefault">33587</TD>
    <TD CLASS="dddefault">UNIV</TD>
    <TD CLASS="dddefault">E101</TD>
    <TD CLASS="dddefault">941</TD>
    <TD CLASS="dddefault">Undergraduate Quarter</TD>
    <TD CLASS="dddefault">&nbsp;</TD>
    <TD CLASS="dddefault">&nbsp;</TD>
    <TD CLASS="dddefault">The Drexel Experience</TD>
    </TR>
    </TABLE
>
....

我得到的输出是:

['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n']

有趣的是,如果我在td之后指定确切的tr索引,就像下面的代码一样,我得到输出:

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td[1]/text()')

输出:

['DUPLICATE ']

好像我需要循环遍历列表,所以我尝试了这个,但也没有用。

for error in errors:
    print error

2 个答案:

答案 0 :(得分:3)

目前尚不清楚问题是什么,但这里是您的XPath表达式的一瞥。

/text()返回当前上下文上下文节点的 direct child 的文本节点。因此,tr[2]/text()会返回第二个tr 直接子的文本节点,这些节点只是空格和换行符

现在将上述内容与tr[2]/td[1]/text()进行对比,后者将返回第二个td中第一个tr直接子的文本节点。这就是你得到输出'DUPLICATE '的方法。

答案 1 :(得分:0)

如果要获取第二个tr内所有td标记的内容,可以使用以下xpath:

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td/text()')