Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTMLXPath:提取混合了多个级别和复杂标记的文本?_Html_Xpath_Scrapy_Html Content Extraction - Fatal编程技术网

HTMLXPath:提取混合了多个级别和复杂标记的文本?

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。。

有关问题:

//对不起,我的英语很差

我是一个编写网络爬虫的初学者,我正在尝试通过xpath从网页(中文)中提取主要内容(尽管我已经了解到提取web主要内容有传统算法和机器学习方法),并且我是编写xpath规则的初学者

我遇到了一个网页,其中包含混合在复杂标记中的文本,我总结如下,其中字符(例如a,A2)仅表示文本,“…”表示更多的标记,甚至没有文本嵌套。我想得到“AA2BB2CDEFGHIJKLMNOP”

。。。
...
AA2


BB2 CDE

FGHIJ

K ... 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(), ""))