HTMLXPath:提取混合了多个级别和复杂标记的文本?
有关问题: //对不起,我的英语很差 我是一个编写网络爬虫的初学者,我正在尝试通过xpath从网页(中文)中提取主要内容(尽管我已经了解到提取web主要内容有传统算法和机器学习方法),并且我是编写xpath规则的初学者 我遇到了一个网页,其中包含混合在复杂标记中的文本,我总结如下,其中字符(例如a,A2)仅表示文本,“…”表示更多的标记,甚至没有文本嵌套。我想得到“AA2BB2CDEFGHIJKLMNOP”HTMLXPath:提取混合了多个级别和复杂标记的文本?,html,xpath,scrapy,html-content-extraction,Html,Xpath,Scrapy,Html Content Extraction,有关问题: //对不起,我的英语很差 我是一个编写网络爬虫的初学者,我正在尝试通过xpath从网页(中文)中提取主要内容(尽管我已经了解到提取web主要内容有传统算法和机器学习方法),并且我是编写xpath规则的初学者 我遇到了一个网页,其中包含混合在复杂标记中的文本,我总结如下,其中字符(例如a,A2)仅表示文本,“…”表示更多的标记,甚至没有文本嵌套。我想得到“AA2BB2CDEFGHIJKLMNOP” 。。。 ... AA2 BB2 CDE FGHIJK ... L M N O p。。
。。。
...
AA2
BB2
CDE
FGHIJK
...
L
M
N
O
p。。。。。。
var page_navigation=document.getElementById('page_navigation');
...
...
感谢前面的问题,我写了一条规则
'字符串(//div[@class=\'art\u context\')'
我得到了所有我想要的没有标签的纯文本内容,但是
中的js代码也被提取出来了。我尝试了以下方法,但似乎没有帮助。其中仍然有js代码
'字符串(//div[@class=\'art\u context\'and not(self::script)])
以下内容仅获取“\r\n”
'//div[@class=\'art\u context\'而非(self::script)]/text()
以下是我的问题:
1.如何编写xpath规则以满足我的需要:提取div[@id=“artibody”]中的内容,除了
2.问题1的规则简单有力吗?也许我会遇到更多带有div[@id=“artibody”]的页面,但子代节点完全不同
3.对我的任务还有什么建议吗?从一个网站中提取web内容,但主要内容位于具有不同id、类和子节点结构的
。我在笔记本电脑(Intel corei5 3225,8G RAM)上运行爬行器,同时使用机器学习算法可能会显著降低爬行速度。同时,编写许多xpath规则似乎很麻烦
如果您能就这个问题(以及我的英语)给我任何建议,我将不胜感激。要获取除脚本
内容之外的所有后代文本节点,您可以使用以下方法:
//div[@class="art_context"]//*[not(self::script)]/text()
在自然语言中:“从非script
元素的所有div[@class=“art\u context”]
元素的后代获取所有文本节点”
选择子代而不仅仅是子代时,需要使用div[@class=“art\u context”]
之后的/
相比之下,问题中的//div[@class=“art\u context”and not(self::script)]/text()
表达式表示“获取所有div[@class=“art\u context”]
元素的所有文本节点子元素,这些元素不是脚本
元素。”
因此问题中表达式中的和not(self::script)
部分是多余的,因为表达式所做的只是选择//div[@class=“art\u context”]
,然后/text()
部分只选择该div
的文本节点直接子节点,这只是换行符
此外,如果不想使用XPath只获取文本节点集,而是想使用XPath将结果作为单个字符串获取,则可以使用函数string join(…)
和normalize space(…)
:
我相信
stringjoin(…)
是XPath2.0,而scrapy(和lxml/libxml2)只支持XPath1.0。因此,连接必须在Python中完成,例如:selector.xpath(//div[@class=“art\u context”]/*[not(self::script)]/text()).extract()
可以使用EXSLT名称空间,不过:selector.xpath(//div[@class=“art\u context”]/*[not(self::script)]/text()),名称空间={str str"http://exslt.org/strings“}).extract_first()
normalize-space(string-join(//div[@class="art_context"]//*[not(self::script)]/text(), ""))