如何在stormcrawler的parsefilter.json中添加更多XPATH
我正在使用stormcrawler(v1.16)和Elasticsearch(v7.5.0)从大约5k个新闻网站中提取数据。我在parsefilter.json中添加了一些用于提取作者姓名的XPATH模式。 Parsefilter.json如下图所示:如何在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”, “
{
“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“/”)
可能会选择错误的一个。这是一个经过计算的风险,我认为这种情况并不常见