簡體   English   中英

提取其中一部分文本的文本<br>標簽僅使用 Xpath

[英]Extract text where a part of text inside <br> tag using only Xpath

我只想從這里獲取字符串:

                  <br>

                5 Brown Circle<br>

                Alabaster,

                AL &nbsp;&nbsp;

                35007

我需要深入了解如何從 html 文檔之后的上述部分中提取文本:

<tr class="prem-tr" id="10425" role="row">
                    <td>
                        <h4><a class="prem-result-link" href="/Search/Details/10425">Graham &amp; Associates, CPAs</a></h4>

                        <a href="tel:+(205) 663-6673">(205) 663-6673</a>
                        <br>

                        5 Brown Circle<br>

                        Alabaster,

                        AL &nbsp;&nbsp;

                        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>&nbsp;&nbsp;

                                <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()])

&nbsp實體和未閉合的<br>標記的處理可能會有所不同,具體取決於您使用的是哪個 XPath 處理器,但以下將產生所請求的確切結果:

//td/text()[string-length(normalize-space(.)) > 0]/normalize-space(translate(.,'&#160;',''))

在哪里

  • //td選擇所有的 td 節點(示例中只有一個),
  • / text()選擇所有作為td的直接子節點的文本節點,
  • predicate [string-length(normalize-space(.)) > 0]消除任何文本節點,當去除前導/尾隨空格時,這些節點是零長度字符串,
  • /normalize-space(translate(.,'&#160;',''))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而不是&nbsp; &#160; 表示不間斷的空格字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM