Xpath grep 元素

Xpath grep elements

我正在使用 Scrapy Python 来尝试从站点中获取数据。 我如何用 Xpath grep 这个结构?

<div class="foo">
<h3>Need this text_1</h3>
    <table class="thesamename">
    <tbody>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">45767</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_1</b><br>
            <span class="tmp_category">TEST_1</span>
        </td>
    </tr>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">1232004</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_2</b><br>
            <span class="tmp_category">TEST_2</span>
        </td>
    </tr>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">122004</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_3</b><br>
            <span class="tmp_category">TEST_3</span>
        </td>
    </tr>
    </tbody>  
<h3>Need this text_2</h3>
        <table class="thesamename">
    <tbody>
       <td class="tmp_year">
          <a href="/link1">234</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_E</b><br>
            <span class="tmp_category">TEST_E</span>
        </td>
    </tr>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">3476</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_C</b><br>
            <span class="tmp_category">TEST_C</span>
        </td>
    </tr>
    </tbody>
<h3>Need this text_3</h3>
        <table class="thesamename">
    <tbody>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">85567</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_T</b><br>
            <span class="tmp_category">TEST_T</span>
        </td>
    </tr>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">435656</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_A</b><br>
            <span class="tmp_category">TEST_A</span>
        </td>
    </tr>
    <tr>  
        <td class="tmp_year">
          <a href="/link1">980</a>        
        </td>
        <td class="tmp_outcome">
            <b>Win_Z</b><br>
            <span class="tmp_category">TEST_Z</span>
        </td>
    </tr>
    </tbody>

我想要这种结构的输出:

"Section": {
Need this text_1 :
  [45767 : Win_1 : TEST_1]
  [1232004 : Win_2 : TEST_2]
  [122004: Win_3 : TEST_3]
,
Need this text_2:
  [234 : Win_E : TEST_E]
  [3476 : Win_C : TEST_C]
,
Need this text_3: 
  [85567 : Win_T : TEST_T]
  [435656 : Win_A : TEST_A]
  [980: Win_Z : TEST_Z]
}

如何创建正确的 xpath select 来采用此结构? 我可以单独使用所有 "h3" ,所有 "a" 然后所有带有 class 的标签,但我如何匹配?

你说 GREP?!大声笑好吧,你这样命名是完全错误的,但是为了保持行话的简洁以理解你的 parsing/extracting... 对 scrapy 这么陌生?或网络开发方面的事情?不管怎样...我无法指望在此处的一个答案中教您如何 xpth/regex 像专业人士一样...唯一的方法是让您坚持下去,但我投入了我的意见。

首先,对于必须按照标准构建的网站,xpath 非常有用,这并没有使它们变坏,但是在您提供的 html 代码片段中......它的结构很好太好了..我推荐css extract ..这些是价值...

year = response.css('td.tmp_year a::text').extract()
outcome = response.css('td.tmp_outcome b::text').extract()
category= response.css('span.tmp_category::text').extract()

专业提示:无论您认为有必要,您都可以将网页另存为 HTML 文件,然后通过引用直接文件路径来使用 scrapy shell ...所以我将 html 片段保存到我桌面上的文件中,然后 运行...

scrapy shell file:///home/scriptso/Desktop/letsGREPlol.html

无论如何...至于 xpath...自从您问大声笑...蛋糕。让我们将 xpath 与 css 进行比较,然后告诉我您可以看到……它?哈哈

response.css('td.tmp_outcome b::text').提取物() td 标签也是如此....并且 class 名称是 tmp_outcome,然后下一个节点是一个粗体标签...其中文本因此将其声明为带有 :: 的文本文字

response.xpath('//td[@class="tmp_outcome"]/b/text()').extract() 所以 xpath 基本上是说我们在整个站点的 td 标签中加注星标...和 ​​class= tmp_outcome,然后是粗体,然后在 xpath 中声明类型 /text() 用于文本.... /@href 用于.. 是的,你猜对了