[英]Extract text where a part of text inside <br> tag using only Xpath
我只想從這里獲取字符串:
<br>
5 Brown Circle<br>
Alabaster,
AL
35007
我需要深入了解如何從 html 文檔之后的上述部分中提取文本:
<tr class="prem-tr" id="10425" role="row">
<td>
<h4><a class="prem-result-link" href="/Search/Details/10425">Graham & Associates, CPAs</a></h4>
<a href="tel:+(205) 663-6673">(205) 663-6673</a>
<br>
5 Brown Circle<br>
Alabaster,
AL
35007
<div class="row result-btmRow">
<div class="col-sm-4">
<span class="result-dist"><small>Distance: 0.00 miles</small></span>
</div><!-- col6 -->
<div class="col-sm-8 result-actions">
<a id="WebsiteURL" class="visit-site" href="http://grahamandassociates.net" target="_blank">Visit Website</a>
<a class="send-email" href="/Search/Details/10425">Send a Message</a>
</div><!-- /col6 -->
</div><!-- /row -->
</td>
</tr>
預期 output: 5 Brown Circle, Alabaster, AL 35007
僅使用 xpath 以及解釋。
或者
在 css 選擇器中,它工作正常。任何人都可以解釋以下代碼嗎? 謝謝
" ".join([" ".join(el.root.strip().split()) for el in sel.css("td::text") if el.root.strip()])
 
實體和未閉合的<br>
標記的處理可能會有所不同,具體取決於您使用的是哪個 XPath 處理器,但以下將產生所請求的確切結果:
//td/text()[string-length(normalize-space(.)) > 0]/normalize-space(translate(.,' ',''))
在哪里
//td
選擇所有的 td 節點(示例中只有一個),text()
選擇所有作為td
的直接子節點的文本節點,[string-length(normalize-space(.)) > 0]
消除任何文本節點,當去除前導/尾隨空格時,這些節點是零長度字符串,/normalize-space(translate(.,' ',''))
將nbsp
字符替換為空,並消除剩余文本節點中的前導/尾隨空格。我不會說這是一個很好的解決方案,但如果要求僅使用 XPath 1.0...
normalize-space(translate(concat(//td/text()[4], //td/text()[5]),"\xa0", ""))
將其分解並在 iPython 中使用lxml.etree
進行演示:
可以使用//td/text()
選擇作為td
子節點的所有文本節點。 這不包括姓名和電話號碼,因為他們是后代而不是孩子。
In [73]: root.xpath('//td/text()')
Out[73]:
['\n ',
'\n\n ',
'\n ',
'\n\n 5 Brown Circle',
'\n\n Alabaster,\n\n AL \xa0\xa0\n\n 35007\n\n ',
'\n ']
理想情況下,我們可以加入所有這些字符串並使用normalize-space()
規范化空白,但這很尷尬,因為在 XPath 1.0 中,我們只有concat()
可用,它只需要兩個 arguments。在 Python 中使用join()
會更好,但是因為我們只對兩個文本節點感興趣,所以我們可以使用concat()
連接集合中的第四個和第五個文本節點以獲得純 XPath 解決方案。
In [74]: root.xpath('concat(//td/text()[4], //td/text()[5])')
Out[74]: '\n\n 5 Brown Circle\n\n Alabaster,\n\n AL \xa0\xa0\n\n 35007\n\n '
現在我們可以應用normalize-space()
來清理空白。
In [75]: root.xpath('normalize-space(concat(//td/text()[4], //td/text()[5]))')
Out[75]: '5 Brown Circle Alabaster, AL \xa0\xa0 35007' '
差不多了。 現在我們只需要在標准化空格之前用translate()
去掉不間斷的空格字符。
In [79]: root.xpath('normalize-space(translate(concat(//td/text()[4], //td/text()[5]),"\xa0", ""))')
Out[79]: '5 Brown Circle Alabaster, AL 35007'
請注意,因為這是 Python,所以我們必須使用\xa0
而不是
或 
表示不間斷的空格字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.