使用具有多个位置的find_elements_by_xpath

时间:2018-01-07 06:09:44

标签: html python-3.x selenium web-scraping

以下是HTML代码段:

<section class="node_category" id="kui_3_1515304072474_68">
    <h3 class="">User details</h3>
<ul class="" id="kui_3_1515304072474_67">
<li class="contentnode" id="kui_3_1515304072474_66">
<dl id="kui_3_1515304072474_65">
<dt class="">Country
</dt>
<dd class="" id="kui_3_1515304072474_64">United States
</dd>
</dl></li>
<li class="contentnode">
<dl>
<dt class="">City/town
</dt>
<dd class="">Somewhere
</dd>
</dl></li>
<li class="contentnode" id="kui_3_1515304072474_76">
<dl id="kui_3_1515304072474_75">
<dt class="">Company
</dt>
<dd class="" id="kui_3_1515304072474_74">ABC Inc
</dd>
</dl></li>
</ul></section>

我想通过XPath从以下HTML类中提取文本:

/ul/li[@class='contentnode'][3]/dl/dd

此“contentnode”类具有从1到最大6的多个位置,用于其他页面。在此示例中,最大值为3。 为了指定所有位置,我构建如下的XPath:

//li[@class='contentnode'][1 <= position() and position() < 7]/dl/dd

现在,我插入我的Python代码,如下所示:

from selenium import webdriver


lst=[]
browser = webdriver.Chrome('./path')
url = "https://<target URL>"
browser.get(url)
contents = browser.find_elements_by_xpath("//li[@class='contentnode'][1 <= position() and position() < 7]/dl/dd")

for t in contents:

    lst.append([t.text])

print(lst)

但是,输出仅显示位置1.它应显示位置1到6的所有文本。

[编辑] 我也试过了,

//li[@class='contentnode'][contains(@id,'kui_3')]/dl/dd

但仍然无效。它没有显示任何错误,但结果都没有。

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

这是符合您需求的工作代码:

from selenium import webdriver


lst = []
browser = webdriver.Chrome()
browser.get("https://<target URL>")

contents = browser.find_elements_by_xpath("//li[@class='contentnode'][1 <= position() and position() < 7]/dl/dd")

for t in contents:

    lst.append(t.text)

print(lst)

browser.quit()

结果将是(根据您的HTML):

['United States', 'Somewhere', 'ABC Inc']

希望它可以帮到你!

答案 1 :(得分:1)

尝试以下代码

from selenium import webdriver

lst=[]
browser = webdriver.Chrome('./path')
url = "https://<target URL>"
browser.get(url)
contents = browser.find_elements_by_xpath("//li[@class='contentnode']/dl/dd")
print len(contents)

for t in contents:
    lst.append(t.text)

print(lst)

答案 2 :(得分:0)

您是否尝试使用css选择器?如果没有,那么你应该试一试:

DEBUG o.h.SQL:92 - select book0_.id as id1_1_, book0_.aut_id as aut_id2_1_ from book book0_ where book0_id=?
TRACE o.h.t.d.s.BasicBinder:65 - binding parameter [1] as [BIGINT] - [1]
DEBUG o.h.SQL:92 - select author0_.id as id1_0_0_ from author author0_ where author0_.id=?
TRACE o.h.t.d.s.BasicBinder:65 - binding parameter [1] as [BIGINT] - [1]