遍历 Python lxml 中 tr 元素的 td 个子元素
Looping through td children of a tr element in Python 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"> </TD>
<TD CLASS="dddefault"> </TD>
<TD CLASS="dddefault">The Drexel Experience</TD>
</TR>
</TABLE
>
....
我得到的输出是:
['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n']
有趣的是,如果我在 tr
之后指定确切的 td
索引,就像下面的代码一样,我会得到输出:
errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td[1]/text()')
输出:
['DUPLICATE ']
看来我需要遍历列表,所以我尝试了这个,但也没有用。
for error in errors:
print error
不清楚问题是什么,但这里是您的 XPath 表达式的作用的一瞥。
/text()
returns 文本节点是当前上下文上下文节点的直接子节点。因此,tr[2]/text()
returns 文本节点是第二个 tr
的 直接子节点 ,它们只是 空格和换行符.
现在将上面的内容与 tr[2]/td[1]/text()
进行对比,后者 return 文本节点是第一个 td
的 直接子节点 在第二个tr
。这就是您获得输出 'DUPLICATE '
.
的方式
如果你想获取第二个tr里面的所有td标签的内容你可以使用下面的xpath:
errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td/text()')
我有以下 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']
有趣的是,如果我在 tr
之后指定确切的 td
索引,就像下面的代码一样,我会得到输出:
errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td[1]/text()')
输出:
['DUPLICATE ']
看来我需要遍历列表,所以我尝试了这个,但也没有用。
for error in errors:
print error
不清楚问题是什么,但这里是您的 XPath 表达式的作用的一瞥。
/text()
returns 文本节点是当前上下文上下文节点的直接子节点。因此,tr[2]/text()
returns 文本节点是第二个 tr
的 直接子节点 ,它们只是 空格和换行符.
现在将上面的内容与 tr[2]/td[1]/text()
进行对比,后者 return 文本节点是第一个 td
的 直接子节点 在第二个tr
。这就是您获得输出 'DUPLICATE '
.
如果你想获取第二个tr里面的所有td标签的内容你可以使用下面的xpath:
errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td/text()')