【问题标题】:How can I get rid of unsought data?我怎样才能摆脱不想要的数据?
【发布时间】:2018-04-09 10:57:35
【问题描述】:

我在 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>

【问题讨论】:

  • lxml也可以用xpath,还是你只想要css
  • @eLRuLL ,没错。我只是在使用 CSS 选择器的任何解决方案。

标签: python python-3.x web-scraping css-selectors lxml


【解决方案1】:

您也可以将 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 子元素的元素才会被匹配。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2021-01-27
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多