从Scrapy中排除div

时间:2015-12-13 19:20:20

标签: python html xpath web-scraping scrapy

我有这个HTML:

<div id="content">
    <h1>Title 1</h1><br><br>

    <h2>Sub-Title 1</h2>
    <br><br>
    Description 1.<br><br>Description 2.
    <br><br>

    <h2>Sub-Title 2</h2>
    <br><br>
    Description 1<br>Description 2<br>
    <br><br>

    <div class="infobox">
        <font style="color:#000000"><b>Information Title</b></font>
        <br><br>Long Information Text
    </div>
</div>

我想在Scrapy中获取<div id="content">中的所有html,但不包括<div class="infobox">块,因此预期结果如下:

<div id="content">
    <h1>Title 1</h1><br><br>

    <h2>Sub-Title 1</h2>
    <br><br>
    Description 1.<br><br>Description 2.
    <br><br>

    <h2>Sub-Title 2</h2>
    <br><br>
    Description 1<br>Description 2<br>
    <br><br>
</div>

如何修改当前的选择器:

item['article_html'] = hxs.select("//div[@id='content']").extract()[0]

3 个答案:

答案 0 :(得分:1)

没有直接的方法可以直接使用选择器(xpath)。

你可以这样做:

content = hxs.select("//div[@id='content']").extract()[0]
infobox = hxs.select("//div[@id='content']//div[@class='infobox']").extract()[0]

item['article_html'] = content.replace(infobox, "")

答案 1 :(得分:0)

您可以操纵元素树以删除有问题的div:

>>> from scrapy.http import HtmlResponse
>>> body = '''\
... <div id="content">
...     <h1>Title 1</h1><br><br>
... 
...     <h2>Sub-Title 1</h2>
...     <br><br>
...     Description 1.<br><br>Description 2.
...     <br><br>
... 
...     <h2>Sub-Title 2</h2>
...     <br><br>
...     Description 1<br>Description 2<br>
...     <br><br>
... 
...     <div class="infobox">
...         <font style="color:#000000"><b>Information Title</b></font>
...         <br><br>Long Information Text
...     </div>
... </div>
... '''
>>> resp = HtmlResponse(url='http://example.com', body=body, encoding='utf8')
>>> xhs = resp.selector
>>> infobox = xhs.css('.infobox')[0].root
>>> infobox.getparent().remove(infobox)
>>> print(xhs.select("//div[@id='content']").extract()[0])
<div id="content">
    <h1>Title 1</h1><br><br>

    <h2>Sub-Title 1</h2>
    <br><br>
    Description 1.<br><br>Description 2.
    <br><br>

    <h2>Sub-Title 2</h2>
    <br><br>
    Description 1<br>Description 2<br>
    <br><br>

    </div>

答案 2 :(得分:0)

您还可以使用CSS选择器:not(...)排除内容。

尽管未经测试,请尝试执行以下操作:

response.css("div[id='content']:not([class*='infobox'])")