【问题标题】:Python - get text between HTML tagsPython - 获取 HTML 标记之间的文本
【发布时间】:2018-05-27 00:06:22
【问题描述】:

您可以在下面看到我的代码。它遍历项目列表并提供一个表格作为输出。

x = PrettyTable(["Soli", "Zusammenfassung", "Bearbeiter", "Status", "Termin"])

display = Display()
display.start()
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.example.com')

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from BeautifulSoup import BeautifulSoup

 for j in range(0,len(total_tickets)):
            url = driver.current_url
            r = requests.get(url)
            html_content = r.text
            soup = BeautifulSoup(html_content, 'lxml')

            ticket = driver.find_elements_by_xpath("//*[@id='ghx-issues-in-epic-table']/tbody/tr/td[2]/a")
            ticket[j].click()

            driver.get_screenshot_as_file("test.png")
            worker = driver.find_element_by_xpath("//*[@id='peopledetails']/li/dl[1]/dd").find_element_by_class_name("user-hover").get_attribute("rel")
            Soli = driver.find_element_by_xpath("//*[@id='key-val']").get_attribute("data-issue-key")
            driver.find_element_by_xpath("//*[@id='summary-val']/span").click()
            conclusion = driver.find_element_by_xpath("//*[@id='summary']").get_attribute("value")
            status = soup.find('span',{'class':'classname'}).get_text
            try:
                termin = driver.find_element_by_xpath("//*[@id='datesmodule']").find_element_by_xpath("//*[@id='customfield_10090-val']/span[1]/time").get_attribute("datetime")
            except NoSuchElementException:
                termin = "No Deadline"

            x.add_row([Soli, conclusion, worker, status, termin])
            x.padding_width = 1
            with open('file', 'w') as w:
                w.write(str(x))

第一个问题,我得到这个错误:

Traceback (most recent call last):
File "save.py", line 104, in <module>
status = soup.find('span',{'class':'classname'}).get_text
AttributeError: 'NoneType' object has no attribute 'get_text'

如果我删除“get_text”属性,状态部分总是显示“NONE”作为输出。

这是它应该获取文本的 HTML。我希望它显示跨标签之间的文本“NEU”。

<li class="item item-right">
    <div class="wrap">
        <strong class="name">
            Status:
        </strong>
        <span id="status-val" class="value">
            <span class="classname" original-title="">
                Neu
            </span>
        </span>
        <span class="status-view">(<a href="#" class="classname">Arbeitsablauf anzeigen</a>)
        </span>
    </div>
</li>

【问题讨论】:

  • 可能是因为span 不在文档的顶层而是嵌套的?顺便说一句,通过xpath 可以很容易地访问它。
  • 您应该使用driver.page_source 而不是requests.get()requests 如果不使用正确的标头,可能会得到与 Selenium 不同的数据。

标签: python html selenium beautifulsoup selenium-chromedriver


【解决方案1】:

你可以在beautifulsoup中使用select方法

soup.select("div#id")[0].text

[0] 表示第一个元素

“#id”是div的id

.class 是 div 的类

【讨论】:

    【解决方案2】:

    如果您使用的是get_text - 您需要调用它,it's a method

    soup.find('span',{'class':'classname'}).get_text()
    

    将这个 BeautifulSoup 定位器“翻译”为 Selenium 的更健壮和可靠的方法是 CSS 选择器,而不是 XPath - XPath 没有任何多值属性处理喜欢class:

    driver.find_element_by_css_selector("span.classname").text
    

    或者,还有一种直接的“按类名”技术:

    driver.find_element_by_class_name("classname").text
    

    【讨论】:

      【解决方案3】:

      知道了:)

      不得不改变

      status = soup.find('span',{'class':'classname'}).get_text
      

      status = driver.find_element_by_xpath("xpath").text
      

      【讨论】:

      • 同时指定xpath
      猜你喜欢
      • 2011-08-07
      • 1970-01-01
      • 2016-05-13
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多