我有以下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"> </TD>
<TD CLASS="dddefault"> </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
答案 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()')