从Scrapy中排除div



我有这个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]

没有直接使用选择器(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, "")

您可以操作元素树来删除有问题的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>

您还可以使用CSS选择器:not(...)来排除事物。

尽管完全未经测试,请尝试以下操作:

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

最新更新