使用scrapy python

时间:2017-05-13 18:48:53

标签: python scrapy

我有一张桌子(5行5列)看起来像这样:

<tr class='A'>
    <td>
        <a href="example.com">Hello</a>
    </td>
    <td> ... </td>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td> ... </td>
</tr>

<tr class='B'>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td> ... </td>
</tr>

<tr class='A'>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td> ... </td>
</tr>

<tr class='A'>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td> ... </td>
</tr>

<tr class='B'>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td>
        <a href="example.com">Dummy link</a>
    </td>
    <td> ... </td>
    <td> ... </td>
</tr>

我想要的是:

  • 选择类名为A
  • 的第一行
  • 从该行中选择第一列,即具有链接<a href="example.com">Hello</a>
  • 的列
  • 检索该链接的href属性,即example.com

我现在拥有的是:

response.css('tr.A td a::attr(href)').extract_first()

似乎工作正常,但我不确定extract_first()是否同时对tr.Atd或其中一个进行操作。

所以我尝试了以下所有内容(与n-child一起玩),但没有一个给出正确的结果。

  • response.css('tr.A:nth-child(0) td a::attr(href)').extract_first()
  • response.css('tr.A td:nth-child(0) a::attr(href)').extract_first()
  • response.css('tr.A:nth-child(0) td:nth-child(0) a::attr(href)').extract()

什么是正确的方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以指定该类,然后查看tda元素,并使用@href

从第一个元素获取extract_first属性值

使用xpath

print response.xpath("//tr[contains(@class, 'A')]/td/a/@href").extract_first()

使用css

print response.css("tr.A > td > a::attr(href)").extract_first()

这是转到tr的{​​{1}},然后转到A里面,然后转到第一个td标记,然后检索a

将html视为:

href

答案 1 :(得分:1)

在您的情况下,解决方案是:

td:nth-child(1)
Selects every <td> element that is the first child of its parent

>>> response.css('tr.A td:nth-child(1) a::attr(href)').extract_first()
'example.com'

说明:

response.css('tr.A td a::attr(href)').extract_first()
_____________________________________________________

此处上面的表达式意味着使用类td选择tr元素中的所有A元素,然后选择所有a元素href属性,但是你正在使用extract_first()它只选择第一场比赛。

您可以随时在shell中测试xpath或css,如下所示:

>>> from scrapy.http import HtmlResponse
>>> response = HtmlResponse(url="Test HTML String", body="""
... <tr class='A'>
...     <td>
...         <a href="example.com">Hello</a>
...     </td>
...     <td> ... </td>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td> ... </td>
... </tr>
... 
... <tr class='B'>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td> ... </td>
... </tr>
... 
... <tr class='A'>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td> ... </td>
... </tr>
... 
... <tr class='A'>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td> ... </td>
... </tr>
... 
... <tr class='B'>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td>
...         <a href="example.com">Dummy link</a>
...     </td>
...     <td> ... </td>
...     <td> ... </td>
... </tr>""")

>>> response.css('tr.A td:nth-child(1) a::attr(href)').extract_first()
'example.com'