Python 如何使用xpath排除某些元素?
因此,我正在进行一个粗略的项目,我想使用XPath捕获以下HTML片段: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
<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