需要帮助编写xpath字符串以匹配多个(但不是全部)表格单元格

时间:2012-07-25 13:38:19

标签: python xpath screen-scraping web-scraping minidom

注意:问题已经更新,因为给出了一些早期答案。这仍然是同一个问题,希望更清楚。

我正在尝试让网站刮刀正常工作,而我遇到一些问题需要为某些表格单元格提供合适的xpath字符串。

<tbody>
  <tr>
    <td class="Label" width="20%" valign="top">Uninteresting section</td>
    <td class="Data"> I don't care about this</td>
  </tr>
  <tr>
    <td></td>
    <td class="Data"> I don't care about this</td>
  </tr>
  <tr>
    <td class="Label" width="20%" valign="top">Interesting section</td>
    <td class="Data"> I want this-1</td>
  </tr>
  <tr>
    <td></td>
    <td class="Data"> I want this-2</td>
  </tr>
  <tr>
    <td></td>
    <td class="Data"> I want this-n</td>
  </tr>
  <tr>
    <td class="Label" width="20%" valign="top">Uninteresting section</td>
    <td class="Data"> I don't care about this</td>
  </tr>
  <tr>
    <td></td>
    <td class="Data"> I don't care about this</td>
  </tr>
</tbody>

我想要有趣部分中所有数据字段的内容。 可以有任意数量的这些。我不关心代码中的任何其他内容,但我需要所有这些。

在上面的例子中:  我想要这个-1  我想要这个-2  我想要这个 -

如果相关,我在Python 2.7中使用xml.dom.minidom和py-dom-xpath。

3 个答案:

答案 0 :(得分:1)

您可以使用

获取该部分(包括其他部分)之后的所有内容
 //tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text()

然后你可以获得你不想要的下一部分的所有内容

//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text()

然后你可以在Python中使用第一个n - m tds。

你可以尝试在XPath中使用位置和计数功能:

  //tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"][position() <= (count(//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text())  - count(//tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text()) )]/text()

如果你有XPath 2.0,你可以使用except运算符优雅地完成它:

 //tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class = "Data"]/text() except  //tr[@class="Entry"]//tr/td[contains(text(), "Section title")]/following::td[@class="Label"][1]/following::td[@class = "Data"]/text()

答案 1 :(得分:0)

//tr[@class="Entry"]/td[@class="Data"]/text()

答案 2 :(得分:0)

//tbody[tr/td[contains(text(),"Section title")]]/tr/td[@class="Data"]/text()

更新。这是做什么的:

  1. 获取tbody tr td td包含“部分标题”

  2. 从每个lass="Data"获取c {{1}}

  3. 的文本