【问题标题】:Parse answer in Quora that contains code在 Quora 中解析包含代码的答案
【发布时间】:2016-01-27 04:42:33
【问题描述】:

我想解析来自 Quora 的这篇帖子或带有代码的通用帖子。
示例http://qr.ae/Rkplrt

通过使用 Python 库 Selenium,我可以获取帖子中的 HTML:

 h = html2text.HTML2Text()
 content = ans.find_element_by_class_name('inline_editor_value')
 html_string = content.get_attribute('innerHTML')
 text = h.handle(html_string)
 print text

我希望这一切都是一段文本。但是对于那些包含代码的表,html2text 会插入很多\n,并且不处理行的索引。

所以我可以看到:
https://imageshack.com/i/paEKbzT4p(这是包含带有代码的表的主要 div。) https://imageshack.com/i/hlIxFayop(html2text 提取的文本)
https://imageshack.com/i/hlHFBXvQp(相反,这是文本的最终打印,索引行和额外的\ns 存在问题。)

我已经尝试了不同的设置,例如 bypasse_tables,在 github 上的本指南中提供:(https://github.com/Alir3z4/html2text/blob/master/docs/usage.md#available-options),但没有成功。

有人能告诉我在这种情况下如何使用 html2text 吗?

【问题讨论】:

  • ...您为什么不在问题中包含图片?

标签: python selenium text html-parsing quora


【解决方案1】:

您实际上根本不需要使用HTML2Text

selenium可以直接给你“文字”:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://qr.ae/Rkplrt")

print(driver.find_element_by_class_name('inline_editor_content').text)

它打印帖子的内容:

The single line of code must be useful, not something meant to be confusing or obfuscating.

...

What examples have you created or encountered ?

【讨论】:

    【解决方案2】:

    您可以使用BeautifulSoup(我使用urllib 与网站通信,因为我不熟悉selenium,但我相信它可以工作)做一些简单的解析HTML:

    import urllib
    from bs4 import BeautifulSoup
    
    # urllib opener
    opener = urllib.request.build_opener(
              urllib.request.HTTPRedirectHandler(),
              urllib.request.HTTPHandler(debuglevel=0),
              urllib.request.HTTPSHandler(debuglevel=0))
    
    # Get page
    html = opener.open("http://qr.ae/Rkplrt").read()
    
    # Create BeautifulSoup object
    soup = BeautifulSoup(html, "lxml")
    
    # Find the HTML element you want
    answer = soup.find('div', { 'class' : 'ExpandedQText ExpandedAnswer' })
    
    # Remove the stuff you don't want
    answer.find('td', { 'class' : 'linenos' }).extract()
    answer.find('div', { 'class' : 'ContentFooter AnswerFooter' }).extract()
    
    # Print
    print("\n".join(answer.stripped_strings))
    

    我不完全确定您要提取什么。上面只给出了答案,包括代码,没有行号:

    This is:
    #include <stdio.h>
    int v,i,j,k,l,s,a[99];
    main()
    {
    for(scanf("%d", &s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v||(i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i]);
    }
    

    更新: OP 要求将&lt;a&gt;&lt;img&gt; 标签替换为它们的hrefsrc 值。下面我的脚本版本应该解决这个问题。它还可以处理多个答案。

    import urllib
    from bs4 import BeautifulSoup
    
    # urllib opener
    opener = urllib.request.build_opener(
              urllib.request.HTTPRedirectHandler(),
              urllib.request.HTTPHandler(debuglevel=0),
              urllib.request.HTTPSHandler(debuglevel=0))
    
    # Get page
    html = opener.open("https://www.quora.com/Is-it-too-late-for-an-X-year-old-to-learn-how-to-program").read()
    
    # Create BeautifulSoup object
    soup = BeautifulSoup(html, "lxml")
    
    # Place to store the final output
    output = ''
    
    # Find the HTML element you want
    answers = soup.find_all('div', { 'class' : 'ExpandedQText ExpandedAnswer' })
    for answer in answers:
    
      # Remove the stuff you don't want
      linenos = answer.find('td', { 'class' : 'linenos' })
      if linenos is not None:
        linenos.extract()
      answer.find('div', { 'class' : 'ContentFooter AnswerFooter' }).extract()
    
      # Replace <a> with its url
      for link in answer.select('a'):
        url = link['href']
        link.insert_after(url)
        link.extract()
    
      # Replace <a> with its url
      for img in answer.select('img'):
        url = img['src']
        img.insert_after(url)
        img.extract()
    
      # Attach to output
      output += "\n".join(answer.stripped_strings) + '\n\n'
    
    # Print
    print(output)
    

    【讨论】:

    • 我不知道BeautifulSoup是否总是好的,因为答案可能包含带有img src的链接或标签。
    • 你想如何解析这些?
    • 我认为您可以使用 BeautifulSoup 做到这一点。你有示例页面吗?
    • quora.com/… 这是一个有很多答案的答案。我应该用 Selenium 滚动这个页面。问题是我不知道 BeautifulSoap 是否被放大来管理所有这些内容。
    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多