我有一张桌子(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 href="example.com">Hello</a>
example.com
我现在拥有的是:
response.css('tr.A td a::attr(href)').extract_first()
似乎工作正常,但我不确定extract_first()
是否同时对tr.A
和td
或其中一个进行操作。
所以我尝试了以下所有内容(与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()
什么是正确的方法?
谢谢!
答案 0 :(得分:1)
您可以指定该类,然后查看td
和a
元素,并使用@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'