如何在stormcrawler的parsefilter.json中添加更多XPATH

如何在stormcrawler的parsefilter.json中添加更多XPATH,json,parsing,xpath,web-crawler,stormcrawler,Json,Parsing,Xpath,Web Crawler,Stormcrawler,我正在使用stormcrawler(v1.16)和Elasticsearch(v7.5.0)从大约5k个新闻网站中提取数据。我在parsefilter.json中添加了一些用于提取作者姓名的XPATH模式。 Parsefilter.json如下图所示: { “com.digitalpebble.stormcrawler.parse.ParseFilters”:[ { “类”:“com.digitalpebble.stormcrawler.parse.filter.XPathFilter”, “

我正在使用stormcrawler(v1.16)和Elasticsearch(v7.5.0)从大约5k个新闻网站中提取数据。我在parsefilter.json中添加了一些用于提取作者姓名的XPATH模式。 Parsefilter.json如下图所示:

{
“com.digitalpebble.stormcrawler.parse.ParseFilters”:[
{
“类”:“com.digitalpebble.stormcrawler.parse.filter.XPathFilter”,
“名称”:“XPathFilter”,
“参数”:{
“canonical”:“/*[@rel=\“canonical\”]/@href”,
“parse.description”:[
“//*[@name=\“description\”]/@content”,
“//*[@name=\“Description\”]/@content”
],
“parse.title”:[
“//标题”,
“//META[@name=\“title\”]/@content”
],
“parse.keywords”:“//META[@name=\“keywords\”]/@content”,
“parse.datePublished”:“//META[@itemprop=\“datePublished\”]/@content”,
“parse.author”:[
“//META[@itemprop=\“author\”]/@content”,
“//输入[@id=\“authorname\”]/@value”,
“//META[@name=\”文章:作者\“]/@content”,
“//META[@name=\“author\”]/@content”,
“//META[@name=\'byline\']/@content”,
“//META[@name=\“dc.creator\”]/@content”,
“//META[@name=\'byl\']/@content”,
“//META[@itemprop=\“authorname\”]/@content”,
“//META[@itemprop=\“article:author\”]/@content”,
“//META[@itemprop=\“byline\”]/@content”,
“//META[@itemprop=\“dc.creator\”]/@content”,
“//META[@rel=\“authorname\”]/@content”,
“//META[@rel=\”文章:作者\“]/@content”,
“//META[@rel=\“byline\”]/@content”,
“//META[@rel=\“dc.creator\”]/@content”,
“//META[@rel=\'author\']/@content”,
“//META[@id=\“authorname\”]/@content”,
“//META[@id=\'byline\']/@content”,
“//META[@id=\“dc.creator\”]/@content”,
“//META[@id=\“author\”]/@content”,
“//META[@class=\“authorname\”]/@content”,
“//META[@class=\”文章:作者\“]/@content”,
“//META[@class=\'byline\']/@content”,
“//META[@class=\“dc.creator\”]/@content”,
“//META[@class=\“author\”]/@content”
]
}
},
我应该做哪些更改,以便所有模式都可以作为输入

我将其理解为“如何创建一个XPath表达式来尝试作者在文档中出现的所有不同方式?”

最简单的方法是:使用XPath联合运算符
|
将您已有的所有表达式连接到一个表达式中:

input[...]|meta[...]|meta[...]|meta[...]
由于这可能会选择多个节点,因此我们可以明确表示我们只关心第一个匹配:

(input[...]|meta[...]|meta[...]|meta[...])[1]
这可能是可行的,但它将非常长且难以阅读。XPath可以做得更好

您的表达式都非常重复,这是减少表达式大小的一个很好的起点。例如,除了属性值之外,这两个表达式是相同的:

//meta[@class='author']/@content|//meta[@class='authorname']/@content
我们可以使用
,它会变得更短:

//meta[@class='author' or @class='authorname']/@content
但当您有5或6个潜在值时,它仍然相当长。下一次尝试,属性的谓词:

//meta[@class[.='author' or .='authorname']]/@content
稍微短一点,因为我们不需要一直键入
@class
。但是仍然很长,有5或6个潜在值。值列表和子字符串搜索如何(我使用
/
作为分隔符):

现在,我们可以轻松地展开有效值列表,甚至可以查看不同的属性:

//meta[contains(
    '/author/authorname/article:author/',
    concat('/', @class|@id , '/')
)]/@content
由于我们在多个可能的属性中寻找几乎相同的可能字符串,我们可以使用一个固定的值列表来检查所有可能的属性:

//meta[
    contains(
        '/author/article:author/authorname/dc.creator/byline/byl/',
        concat('/', @name|@itemprop|@rel|@id|@class, '/')
    )
]/@content
结合前两点,我们可以得出以下结论:

(
    //meta[
        contains(
            '/author/article:author/authorname/dc.creator/byline/byl/',
            concat('/', @name|@itemprop|@rel|@id|@class, '/')
        )
    ]/@content
    |
    //input[
        @id='authorname'
    ]/@value
)[1]
警告:只有当一个
永远不会同时具有两个值时,例如
@name
@rel
,或者如果它们至少都具有相同的值,这才如预期的那样有效。否则
concat('/',@name |@itemprop |@rel |@id |@class'/'))
可能会选择错误的。这是一个经过计算的风险,我认为这种情况在HTML中并不常见。但您需要决定,您是知道输入数据的人

我应该做哪些更改,以便所有模式都可以作为输入

我将其理解为“如何创建一个XPath表达式来尝试作者在文档中出现的所有不同方式?”

最简单的方法是:使用XPath联合运算符
|
将您已有的所有表达式连接到一个表达式中:

input[...]|meta[...]|meta[...]|meta[...]
由于这可能会选择多个节点,因此我们可以明确表示我们只关心第一个匹配:

(input[...]|meta[...]|meta[...]|meta[...])[1]
这可能是可行的,但它将非常长且难以阅读。XPath可以做得更好

您的表达式都非常重复,这是减少表达式大小的一个很好的起点。例如,除了属性值之外,这两个表达式是相同的:

//meta[@class='author']/@content|//meta[@class='authorname']/@content
我们可以使用
,它会变得更短:

//meta[@class='author' or @class='authorname']/@content
但当您有5或6个潜在值时,它仍然相当长。下一次尝试,属性的谓词:

//meta[@class[.='author' or .='authorname']]/@content
稍微短一点,因为我们不需要一直键入
@class
。但是仍然很长,有5或6个潜在值。值列表和子字符串搜索如何(我使用
/
作为分隔符):

现在,我们可以轻松地展开有效值列表,甚至可以查看不同的属性:

//meta[contains(
    '/author/authorname/article:author/',
    concat('/', @class|@id , '/')
)]/@content
由于我们在多个可能的属性中寻找几乎相同的可能字符串,我们可以使用一个固定的值列表来检查所有可能的属性:

//meta[
    contains(
        '/author/article:author/authorname/dc.creator/byline/byl/',
        concat('/', @name|@itemprop|@rel|@id|@class, '/')
    )
]/@content
结合前两点,我们可以得出以下结论:

(
    //meta[
        contains(
            '/author/article:author/authorname/dc.creator/byline/byl/',
            concat('/', @name|@itemprop|@rel|@id|@class, '/')
        )
    ]/@content
    |
    //input[
        @id='authorname'
    ]/@value
)[1]
警告:只有当一个
永远不会同时具有两个值时,或者如果它们至少都具有相同的值,这才像预期的那样起作用。否则
concat(“/”、@name |@itemprop |@rel |@id |@class“/”)
可能会选择错误的一个。这是一个经过计算的风险,我认为这种情况并不常见