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