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