Xpth提取普通电子邮件文本

时间:2016-05-04 19:56:06

标签: xpath web-scraping

我正在尝试从列表中提取电子邮件文本但没有成功。 特别是我使用了这段代码

//li/div/p//*[contains(., '@')]

但奇怪的是它不起作用!你可以帮帮我吗? 这是代码示例

<li class="bgmp_list-item">
            <h3 class="bgmp_list-placemark-title">
                <a href="http://www.exemple.com" class=""> Name1 </a>
            </h3>

            <div class="bgmp_list-description">
                <p class="">
                    <strong class="">Responsible:</strong> John Doe                      <br>
                    <strong class="">Site:</strong> <a title="www.exemple.com" href="http://www.exemple.com" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.2ld.it']);" target="_blank" class="">www.2ld.it</a>
                    <br>
                    <strong class="">Email:</strong> some_email@email.com                        
        <br><strong class="">Address:</strong> <a href="http://www.exemple.com" target="_blank" class="">3, Main Street 00000, London</a>                        <br>
                    <strong>Tel:</strong> 00 000000 <strong>Fax:</strong> 0000000                    
        </p>

            </div>

2 个答案:

答案 0 :(得分:1)

你几乎就在那里,但并不完全。对于示例代码,正确的xpath将是

//p/text()[contains(.,'@')]

不要重新发明轮子是另一个answer

上非常好的解释

答案 1 :(得分:0)

使用p//*[contains(., '@')]将谓词应用于<p> 的各个子元素,而没有此类子元素,因为 目标电子邮件地址文本是<p>的直接子项。这是初始XPath无法工作的原因之一。直接在<p>上应用谓词应该有效:

//li/div/p[contains(., '@')]

但是会返回<p>元素。如果您只需要返回包含电子邮件地址的文本节点,那么谓词应该应用于<p>中的各个文本节点,如另一个答案中所述:

//li/div/p/text()[contains(., '@')]