选择具有指定显示内容的{html}标记

时间:2017-09-18 22:35:41

标签: python html scrapy

我是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中来解决我的问题?

提前致谢。任何建议都将受到高度赞赏!

2 个答案:

答案 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