我是scrapy的新手,并且已经为这个问题奋斗了好几个小时 我需要刮一页,其源代码看起来像这样:
<tr class="odd">
<td class="pfama_PF02816">Pfam</td>
<td><a href="http://pfam.xfam.org/family/Alpha_kinase">Alpha_kinase</a></td>
<td>1389</td>
<td>1590</td>
<td class="sh" style="display: none">21.30</td>
</tr>
当且仅当a标签具有&#34; Alpha_kinase&#34;时,我才需要获取tr.odd
标签的信息。值
我可以获得所有这些内容(包括&#34; Alpha_kinase&#34;,1389,1590和许多其他值),然后处理输出以获得&#34; Alpha_kinase&#34;只是,但这种方法将非常脆弱和丑陋。目前我必须这样做:
positions = response.css('tr.odd td:not([class^="sh"]) td a::text').extract()
然后做一个for循环检查。
是否有任何条件(如上面td.not
)表达式放在response.css中来解决我的问题?
提前致谢。任何建议都将受到高度赞赏!
答案 0 :(得分:0)
您可以使用其他选择器:response.xpath
从html中选择元素
并使用xpath contains
函数过滤文本。
>>> response.xpath("//tr[@class='odd']/td/a[contains(text(),'Alpha_kinase')]")
[<Selector xpath="//tr[@class='odd']/td/a[contains(text(),'Alpha_kinase')]" data='<a href="http://pfam.xfam.org/family/Alp'>]
答案 1 :(得分:0)
我假设页面上有多个这样的tr
元素。如果是这样,我可能会做类似的事情:
# get only rows containing 'Alpha_kinase' in link text
for row in response.xpath('//tr[@class="odd" and contains(./td/a/text(), "Alpha_kinase")]'):
# extract all the information
item['link'] = row.xpath('./td[2]/a/@href').extract_first()
...
yield item