我已经在python中编写了一些代码来删除每个标题下的一些标题和内容。除最后一个容器外,刮刀正常。我希望解析除最后一个容器之外的每个容器的字段。在这里,我使用container
一词来表示fieldset
标记及其中的内容。但是,我怎样才能摆脱最后一个容器中的数据并继续使用css选择器解析其他容器中的数据,我重复css选择器?
以下是我尝试的内容:
from lxml.html import fromstring
import requests
res = requests.get("http://www.webscantest.com/").text
soup = fromstring(res)
for data in soup.cssselect("fieldset"):
title = data.cssselect("legend")[0].text
content = [item.text.strip() for item in data.cssselect("a")]
print(title,' '.join(content))
为了摆脱注意到div
标记的最后一个容器中的数据,我使用了像for data in soup.cssselect("fieldset:not(div)"):
这样的选择器但仍然相同。但是,我可以使用for data in soup.cssselect("fieldset")[:-1]:
来获得所需的结果,但是我想摆脱的容器不需要总是处于最后位置,或者它们可能会在内部重复几次。
以下是我之后的数据所在的元素(前两个是相同的,但最后一个包含div标签):
<fieldset>
<legend>JS tests:</legend>
<a href="soap/demo/">SOAP SPA page</a>
<a href="rest/demo/">REST SPA page</a>
<a href="react/">ReactJS test page</a>
</fieldset>
<fieldset>
<legend>JS tests:</legend>
<a href="soap/demo/">SOAP SPA page</a>
<a href="rest/demo/">REST SPA page</a>
<a href="react/">ReactJS test page</a>
</fieldset>
<fieldset>
<legend>Basic tests:</legend>
<div>
<select name="redirect" onchange="javascript: gotoselect();">
<option value="pickone">Pick a category </option>
<option value="hrs">HTTP Response Splitting Tests</option>
<option value="payment_analysis">Parameter Analysis Tests</option>
</select>
</div>
<a href="jsmenu/auto_osrun.php">OS Command Inject Tests</a>
<a href="jsmenu/cookie_set_coffeepits.php">Java Grinder Tests</a>
<a href="jsmenu/dynalink_myfiles.php">Directory Browse Tests</a>
<a href="jsmenu/dynalink_rfplaces.php">Resource Finder Tests</a>
</fieldset>
答案 0 :(得分:0)
您也可以将xpath与lxml
一起使用,在这种情况下它很有用,您的代码应如下所示:
from lxml.html import fromstring
import requests
res = requests.get("http://www.webscantest.com/").text
soup = fromstring(res)
for data in soup.xpath("//fieldset[not(div)]"):
title = data.cssselect("legend")[0].text
content = [item.text.strip() for item in data.cssselect("a")]
print(title,' '.join(content))
只有没有直接div
孩子的元素才会匹配。