使用selenium从网页中拉取文本不起作用

时间:2014-08-05 19:43:08

标签: python html selenium

我试图从网页上提取一些文字。我想从中提取数据的页面源是:

<tbody>
    <tr class="drx_dotted">
        <td class="drx_first">
            <span name="pharmacy"
                  longitude="-82.531457"
                  latitude="42.617612"
                  pharmacyname="CVS Pharmacy #"
                  address="1025 St Clair River Dr"
                  city="Algonac"
                  state="MI"
                  zip="48001"
                  phone="8107944941">
            </span>
            <p>
                <strong>CVS Pharmacy #</strong><br />
                1025 St Clair River Dr<br />
                Algonac, MI 48001<br />
                1-810-794-4941
            </p>
            <p>
                <a class=""
                   data-ajax="true"
                   data-ajax-method="post"
                   data-ajax-success="UpdateSearchPharmacyList"
                   href="/pfdn/SharedPharmacy/AddNetworkPharmacy?pharmacyNABP=2352324&amp;language=English">Add Pharmacy
                    <span class='HiddenText'> CVS Pharmacy #</span>
                </a>
            </p>
        </td>
        <td>
            <p>
                Retail
            </p>
        </td>
        <td>
            <p>
                Not applicable
            </p>
        </td>
    </tr>

我想拉出&#34;不适用&#34;靠近HTML代码的底部。这是&#34; p&#34;在第三个&#34; td&#34;在HTML源代码中。还有一堆这样的,所以我想把所有这些标签一起拉到python列表中。

以下是我用来查找HTML的硒代码:

x = driver.find_elements_by_xpath(
    '//[@id="divSearchResultContainer"]/div[2]/div[2]/table/tbody/tr/td[3]/p')

当我输入print(x)时,它打印出来:

[<selenium.webdriver.remote.webelement.WebElement object at 0x101f98210>,
 <selenium.webdriver.remote.webelement.WebElement object at 0x101f98250>,
 <selenium.webdriver.remote.webelement.WebElement object at 0x101f98290>]

所以selenium找到并拉出三个实例(这是正确的,它应该找到三个)。但是,当我尝试使用

来拉文本时
print x[0].text

输出是:

None

我尝试了很多变化,甚至尝试单独找到每个元素,但它仍然无法正常工作。有谁有这个问题?我该如何解决?

由于

2 个答案:

答案 0 :(得分:1)

问题是您有多个tr标记,请获取相应的标记。使用find_element_by_xpath()查找单个元素而不是列表,并使用以下xpath:

'//[@id="divSearchResultContainer"]/div[2]/div[2]/table/tbody/tr[1]/td[3]/p

python代码:

element = driver.find_elements_by_xpath(
'//[@id="divSearchResultContainer"]/div[2]/div[2]/table/tbody/tr[1]/td[3]/p')

请注意[1]之后的tr。这就是我们如何看待第一个tr标记。


另请注意,xpath看起来很脆弱 - 这是因为使用了索引:在此div中给我第二个div,然后在第二个div等等。使用divSearchResultContainer id发布元素的完整内容有助于为您提供更好的解决方案。

答案 1 :(得分:0)

尝试使用xpath,我还没有测试,但xpath有last()运算符,这就是你想要的。

"//tbody//tr//td[last()]/p[last()]/text()"