Python 如何使用xpath排除某些元素?

Python 如何使用xpath排除某些元素?,python,html,xpath,web-scraping,scrapy,Python,Html,Xpath,Web Scraping,Scrapy,因此,我正在进行一个粗略的项目,我想使用XPath捕获以下HTML片段: <table id='foobar'> <tr> <td><p>....</td> <td><div>...</div></td> </tr> <tr> <td><script type='text/ja

因此,我正在进行一个粗略的项目,我想使用XPath捕获以下HTML片段:

<table id='foobar'>
    <tr>
        <td><p>....</td>
        <td><div>...</div></td>
    </tr>
    <tr>
        <td><script type='text/javascript'>...</script></td>
        <td><p>.....<br></td>
    </tr>
    <tr>
        <td><div><p>.....</div></td>
        <td><script type='text/javascript'>...</script></td>
    </tr>
    <!--repeat for another 250 or so rows-->
</table>
但这并不排除脚本标记,所以我将其更改为

//table[contains(@id, 'foobar')]//script/*[following-sibling::* and preceding-sibling::*]
认为这会奏效,但是。这可以在xpath中实现吗?还是我最好从表中获取所有内容,迭代内容,删除其中包含“text/javascript”的内容

使用
/*[not(self::script)]
可以排除带有
标记的所有子节点

from lxml import etree

# you have invalid closing tags which I have fixed on my string
s = '''
<table id='foobar'>
    <tr>
        <td><p>....</p></td>
        <td><div>...</div></td>
    </tr>
    <tr>
        <td><script type='text/javascript'>...</script></td>
        <td><p>.....<br /></p></td>
    </tr>
    <tr>
        <td><div><p>.....</p></div></td>
        <td><script type='text/javascript'>...</script></td>
    </tr>
    <!--repeat for another 250 or so rows-->
</table>
'''

tree = etree.fromstring(s)

for each in tree.xpath("//table[contains(@id, 'foobar')]//*[not(self::script)]"):
    print each.tag

tr
td
p
td
div
tr
td
td
p
br
tr
td
div
p
td
从lxml导入etree
#您的结束标记无效,我已将其固定在字符串上
s='''

... ... ..…

... ''' tree=etree.fromstring 对于tree.xpath(//table[contains(@id,'foobar')]//*[not(self::script)])中的每个文件: 打印每个.tag tr 运输署 P 运输署 div tr 运输署 运输署 P 溴 tr 运输署 div P 运输署
因为您使用的是
Scrapy
,所以您可以使用xpath(不包括脚本标记)精确地提取表中的项目,而无需获取所有内容。但是,如果项目规模较小,那么先把所有事情做好也不是一个坏主意。
from lxml import etree

# you have invalid closing tags which I have fixed on my string
s = '''
<table id='foobar'>
    <tr>
        <td><p>....</p></td>
        <td><div>...</div></td>
    </tr>
    <tr>
        <td><script type='text/javascript'>...</script></td>
        <td><p>.....<br /></p></td>
    </tr>
    <tr>
        <td><div><p>.....</p></div></td>
        <td><script type='text/javascript'>...</script></td>
    </tr>
    <!--repeat for another 250 or so rows-->
</table>
'''

tree = etree.fromstring(s)

for each in tree.xpath("//table[contains(@id, 'foobar')]//*[not(self::script)]"):
    print each.tag

tr
td
p
td
div
tr
td
td
p
br
tr
td
div
p
td