![](/img/trans.png)
[英]How to formulate an XPATH expression for an attribute that contains a certain string?
[英]Xpath expression for text that contains a certain string
在網站http://www.apkmirror.com/apk/redditinc/reddit/reddit-1-5-5-release/reddit-1-5-5-android-apk-download/上 ,我正在嘗試提取包含Android的Min:
和Target:
版本的行(請參見下面的屏幕截圖)。
到目前為止,在Scrapy shell中,我已經提出了XPath表達式
In [1]: android_version = response.xpath('//*[@title="Android version"]/following-sibling::*[@class="appspec-value"]')
這樣,如果我將.//text()
和extract()
連接起來, .//text()
得到幾行,包括我想要的行:
In [2]: android_version_text = android_version.xpath('.//text()').extract()
In [3]: android_version_text
Out[3]:
[u'\n',
u'Min: Android 4.0.3 (Ice Cream Sandwich MR1, API 15) ',
u'\n',
u'Target: Android 6.0 (Marshmallow, API 23)',
u'\n']
現在,我想優化XPath表達式以僅獲取包含包含"Min:"
或"Target:
"Min:"
text()
字段。在XPath contains(text(),'some string')之后,當與具有更多內容的node一起使用時,將不起作用我嘗試過一個Text子節點
In [7]: android_version.xpath('.//*[contains(text(), "Min:"]')
但這引起了
ValueError: XPath error: Invalid expression in .//*[contains(text(), "Min:"]
例如,如何構造XPath表達式以僅獲取Min:
行?
在https://blog.scrapinghub.com/2014/07/17/xpath-tips-from-the-web-scraping-trenches/之后,我想到了以下內容:
In [12]: android_min_version = response.xpath('//*[@title="Android version"]/following-sibling::*[@class="appspec-value"]//text()[starts-with(., "Min:")]')
In [13]: android_min_version.extract()
Out[13]: [u'Min: Android 4.0.3 (Ice Cream Sandwich MR1, API 15) ']
簡而言之,要過濾所需的文本,請先執行普通的//text()
后接[contains(., "target_string")]
,其中"target_string"
是要搜索的字符串。 (在這里,我還使用了starts-with
而不是contains
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.