遍历 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">&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']

有趣的是,如果我在 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()')