Xquery 使用Xidel提取同一行的href和文本,仅限于特定链接

Xquery 使用Xidel提取同一行的href和文本,仅限于特定链接,xquery,xidel,Xquery,Xidel,我试图提取html页面中大量链接的标记内的链接(href)和文本 我只想要特定的链接,我用一个子串匹配 我的html示例: <a href="/this/dir/1234/">This should be 1234</a> some other html <a href="/this/dir/1236/">This should be 1236</a> some other html <a href="/about_us/">Not i

我试图提取html页面中大量链接的
标记内的链接(href)和文本

我只想要特定的链接,我用一个子串匹配

我的html示例:

<a href="/this/dir/1234/">This should be 1234</a> some other html
<a href="/this/dir/1236/">This should be 1236</a> some other html
<a href="/about_us/">Not important link</a> some other html
它基本上是可行的,但仍存在两个问题:

  • 我用换行符分隔数据。我想把它放在同一条线上
  • 每个链接文本都会返回,所以我也会得到文本“不重要的链接”
获得输出的推荐方法是什么

/this/dir/1234  ; This should be 1234
/this/dir/1236  ; This should be 1236
感谢您的反馈/提示

编辑

马丁提供的解决方案在那里占99%。没有输出换行符,因此我使用awk将虚拟文本替换为换行符

注意:我在windows上

xidel myhtml.htm -e "string-join(//a[contains(@href, '/this/dir')]!(@href || ' ; ' || .), 'XXX')" | awk -F "XXX" "{$1=$1}1" "OFS=\n" 

您可以将条件移动到谓词中,例如
//a[contains(@href,/this/dir')!(@href,string())
。至于结果格式,如果使用

string-join(//a[contains(@href, '/this/dir')]!(@href || ' ; ' || .), '&#10;')

谢谢你,马丁!这是99%的正确率。请参阅我对原始问题的编辑。我不知道谓词的用法。
”
;'
使用的是XQuery语法,因此如果Xidel有任何选项来确保传入的表达式的计算结果是XQuery而不是普通XPath,那么请尝试这样做。或者使用
codepoints to string(10)
,例如
string连接(//a[contains(@href,/this/dir'))!(@href | | | | | | | |')、codepoints to string(10))
,这应该作为XPath进行。字符串(10)的代码点起作用。你真聪明。谢谢大家!@MartinHonnen,通过将整个查询放入
string-join()
中,可以预期整个输出都在一行中。MyICQ喜欢将每个@href单独放在一行,因此
//a[contains(@href,“/this/dir')]/join(@href,”,“;”)
,或
//a[contains(@href,“/this/dir')]/concat(@href,”;)
会更好。@Reino,您是否可以引用XQuery规范或XQuery函数规范中的任何内容来支持您的说法,即使用
字符串连接(//a[contains(@href,/this/dir')!(@href | |'|'|'|'),“
;”)
,就像我所做的那样,将整个输出放在一行上?我不知道你的期望是从哪里来的,我当然不会分享它们。我不明白为什么
//a[contains(@href,/this/dir')]/concat(@href,;”,)
确保在单独的行上进行输出,您可以构造字符串序列,而不在它们之间定义任何分隔符。
string-join(//a[contains(@href, '/this/dir')]!(@href || ' ; ' || .), '&#10;')